coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
generic.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <acpi/acpigen.h>
4 #include <device/device.h>
5 #include <device/pci.h>
6 #include <device/pci_ids.h>
7 
8 #include "chip.h"
9 
10 #define ACPI_DSM_PRIVACY_SCREEN_UUID "C7033113-8720-4CEB-9090-9D52B3E52D73"
11 
12 #define ACPI_METHOD_EPS_PRESENT "EPSP"
13 #define ACPI_METHOD_EPS_STATE "EPSS"
14 #define ACPI_METHOD_EPS_ENABLE "EPSE"
15 #define ACPI_METHOD_EPS_DISABLE "EPSD"
16 
17 static void privacy_screen_detect_cb(void *arg)
18 {
20 
22  acpigen_emit_namestring(config->detect_function);
27 }
29 {
31 
33  acpigen_emit_namestring(config->status_function);
34 }
35 static void privacy_screen_enable_cb(void *arg)
36 {
38 
39  acpigen_emit_namestring(config->enable_function);
40 }
41 static void privacy_screen_disable_cb(void *arg)
42 {
44 
45  acpigen_emit_namestring(config->disable_function);
46 }
47 
48 static void (*privacy_screen_callbacks[])(void *) = {
53 };
54 
55 static void privacy_gpio_acpigen(struct acpi_gpio *gpio)
56 {
57  /* EPS Present */
61 
62  /* EPS State */
68 
69  /* EPS Enable */
73 
74  /* EPS Disable */
78 }
79 
82 {
83  if (!privacy->enabled)
84  return;
85 
86  /* Populate ACPI methods, if EPS controlled via gpio */
87  if (privacy->gpio.pin_count == 1) {
88  privacy_gpio_acpigen(&privacy->gpio);
93  }
94 
98  privacy);
99 }
100 
101 static void gfx_fill_ssdt_generator(const struct device *dev)
102 {
103  size_t i;
105 
106  const char *scope = acpi_device_scope(dev);
107 
108  if (!scope)
109  return;
110 
111  acpigen_write_scope(scope);
112 
113  /* Method (_DOD, 0) */
114  acpigen_write_method("_DOD", 0);
116  acpigen_write_package(config->device_count);
117  for (i = 0; i < config->device_count; i++)
118  acpigen_write_dword(config->device[i].addr);
119  acpigen_pop_len(); /* End Package. */
120  acpigen_pop_len(); /* End Method. */
121 
122  for (i = 0; i < config->device_count; i++) {
123  acpigen_write_device(config->device[i].name);
124  if (config->device[i].hid)
125  acpigen_write_name_string("_HID", config->device[i].hid);
126  else
127  acpigen_write_name_integer("_ADR", config->device[i].addr);
128 
129  acpigen_write_name_integer("_STA", 0xF);
130  gfx_fill_privacy_screen_dsm(&config->device[i].privacy);
131  acpigen_pop_len(); /* Device */
132  }
133  acpigen_pop_len(); /* Scope */
134 }
135 
136 static const char *gfx_acpi_name(const struct device *dev)
137 {
139 
140  return config->name ? : "GFX0";
141 }
142 
143 static struct device_operations gfx_ops = {
144  .acpi_name = gfx_acpi_name,
145  .acpi_fill_ssdt = gfx_fill_ssdt_generator,
146 };
147 
148 static void gfx_enable(struct device *dev)
149 {
151 
152  if (!config || !dev->enabled)
153  return;
154 
155  dev->ops = &gfx_ops;
156 }
157 
159  CHIP_NAME("Generic Graphics Device")
160  .enable_dev = gfx_enable
161 };
const char * acpi_device_scope(const struct device *dev)
Definition: device.c:158
void acpigen_write_dword(unsigned int data)
Definition: acpigen.c:108
void acpigen_emit_namestring(const char *namepath)
Definition: acpigen.c:275
void acpigen_write_store(void)
Definition: acpigen.c:1333
void acpigen_pop_len(void)
Definition: acpigen.c:37
void acpigen_write_scope(const char *name)
Definition: acpigen.c:326
int acpigen_disable_tx_gpio(const struct acpi_gpio *gpio)
Definition: acpigen.c:2023
void acpigen_write_if_lequal_op_int(uint8_t op, uint64_t val)
Definition: acpigen.c:1472
void acpigen_write_return_byte(uint8_t arg)
Definition: acpigen.c:1577
char * acpigen_write_package(int nr_el)
Definition: acpigen.c:86
void acpigen_write_name_integer(const char *name, uint64_t val)
Definition: acpigen.c:170
void acpigen_emit_byte(unsigned char b)
Definition: acpigen.c:61
void acpigen_get_rx_gpio(const struct acpi_gpio *gpio)
Definition: acpigen.c:2031
void acpigen_write_dsm(const char *uuid, void(**callbacks)(void *), size_t count, void *arg)
Definition: acpigen.c:1629
void acpigen_write_device(const char *name)
Definition: acpigen.c:769
int acpigen_enable_tx_gpio(const struct acpi_gpio *gpio)
Definition: acpigen.c:2015
void acpigen_write_method(const char *name, int nargs)
Definition: acpigen.c:758
void acpigen_write_return_singleton_buffer(uint8_t arg)
Definition: acpigen.c:1566
void acpigen_write_name_string(const char *name, const char *string)
Definition: acpigen.c:176
#define ARRAY_SIZE(a)
Definition: helpers.h:12
static void privacy_screen_get_status_cb(void *arg)
Definition: generic.c:28
#define ACPI_METHOD_EPS_STATE
Definition: generic.c:13
#define ACPI_METHOD_EPS_DISABLE
Definition: generic.c:15
static struct device_operations gfx_ops
Definition: generic.c:143
static void privacy_screen_disable_cb(void *arg)
Definition: generic.c:41
static void gfx_fill_ssdt_generator(const struct device *dev)
Definition: generic.c:101
static void gfx_fill_privacy_screen_dsm(struct drivers_gfx_generic_privacy_screen_config *privacy)
Definition: generic.c:80
struct chip_operations drivers_gfx_generic_ops
Definition: generic.c:158
#define ACPI_DSM_PRIVACY_SCREEN_UUID
Definition: generic.c:10
static void privacy_gpio_acpigen(struct acpi_gpio *gpio)
Definition: generic.c:55
#define ACPI_METHOD_EPS_PRESENT
Definition: generic.c:12
static void privacy_screen_detect_cb(void *arg)
Definition: generic.c:17
static void gfx_enable(struct device *dev)
Definition: generic.c:148
static void(* privacy_screen_callbacks[])(void *)
Definition: generic.c:48
static void privacy_screen_enable_cb(void *arg)
Definition: generic.c:35
static const char * gfx_acpi_name(const struct device *dev)
Definition: generic.c:136
#define ACPI_METHOD_EPS_ENABLE
Definition: generic.c:14
@ LOCAL0_OP
Definition: acpigen.h:81
@ LOCAL2_OP
Definition: acpigen.h:83
@ RETURN_OP
Definition: acpigen.h:146
#define CHIP_NAME(X)
Definition: device.h:32
struct bootblock_arg arg
Definition: decompressor.c:22
enum board_config config
Definition: memory.c:448
int pin_count
Definition: acpi_device.h:165
Definition: device.h:107
struct device_operations * ops
Definition: device.h:143
DEVTREE_CONST void * chip_info
Definition: device.h:164
unsigned int enabled
Definition: device.h:122
Definition: pinmux.c:36
typedef void(X86APIP X86EMU_intrFuncs)(int num)