coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
usb_acpi.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <acpi/acpi_device.h>
4 #include <acpi/acpi_pld.h>
5 #include <acpi/acpigen.h>
6 #include <console/console.h>
7 #include <device/device.h>
8 #include <device/path.h>
9 #include "chip.h"
10 
12 {
13  if (cfg->privacy_gpio.pin_count)
14  return true;
15 
16  if (cfg->reset_gpio.pin_count && !cfg->has_power_resource)
17  return true;
18 
19  return false;
20 }
21 
22 static int usb_acpi_write_gpio(struct acpi_gpio *gpio, int *curr_index)
23 {
24  int ret = -1;
25 
26  if (gpio->pin_count == 0)
27  return ret;
28 
30  ret = *curr_index;
31  (*curr_index)++;
32 
33  return ret;
34 }
35 
36 static void usb_acpi_fill_ssdt_generator(const struct device *dev)
37 {
39  const char *path = acpi_device_path(dev);
40  struct acpi_pld pld;
41 
42  if (!path || !config)
43  return;
44 
45  /* Don't generate output for hubs, only ports */
46  if (config->type == UPC_TYPE_HUB)
47  return;
48 
49  acpigen_write_scope(path);
50  if (config->desc)
51  acpigen_write_name_string("_DDN", config->desc);
53 
54  if (usb_acpi_get_pld(dev, &pld))
55  acpigen_write_pld(&pld);
56  else
57  printk(BIOS_ERR, "Error retrieving PLD for %s\n", path);
58 
59  /* Resources */
60  if (usb_acpi_add_gpios_to_crs(config) == true) {
61  struct acpi_dp *dsd;
62  int idx = 0;
63  int reset_gpio_index = -1;
64  int privacy_gpio_index;
65 
66  acpigen_write_name("_CRS");
68  if (!config->has_power_resource) {
69  reset_gpio_index = usb_acpi_write_gpio(
70  &config->reset_gpio, &idx);
71  }
72  privacy_gpio_index = usb_acpi_write_gpio(&config->privacy_gpio,
73  &idx);
75 
76  dsd = acpi_dp_new_table("_DSD");
77  if (reset_gpio_index >= 0)
78  acpi_dp_add_gpio(dsd, "reset-gpio", path,
79  reset_gpio_index, 0,
80  config->reset_gpio.active_low);
81  if (privacy_gpio_index >= 0)
82  acpi_dp_add_gpio(dsd, "privacy-gpio", path,
83  privacy_gpio_index, 0,
84  config->privacy_gpio.active_low);
85  acpi_dp_write(dsd);
86  }
87 
88  if (config->has_power_resource) {
89  const struct acpi_power_res_params power_res_params = {
90  &config->reset_gpio,
91  config->reset_delay_ms,
92  config->reset_off_delay_ms,
93  &config->enable_gpio,
94  config->enable_delay_ms,
95  config->enable_off_delay_ms,
96  NULL,
97  0,
98  0,
99  config->use_gpio_for_status
100  };
101  acpi_device_add_power_res(&power_res_params);
102  }
103 
104  acpigen_pop_len();
105 
106  printk(BIOS_INFO, "%s: %s at %s\n", path,
107  config->desc ? : dev->chip_ops->name, dev_path(dev));
108 }
109 
110 static struct device_operations usb_acpi_ops = {
112  .set_resources = noop_set_resources,
113  .scan_bus = scan_static_bus,
114  .acpi_fill_ssdt = usb_acpi_fill_ssdt_generator,
115 };
116 
117 static void usb_acpi_enable(struct device *dev)
118 {
119  dev->ops = &usb_acpi_ops;
120 }
121 
123  CHIP_NAME("USB ACPI Device")
124  .enable_dev = usb_acpi_enable
125 };
126 
127 bool usb_acpi_get_pld(const struct device *usb_device, struct acpi_pld *pld)
128 {
130 
131  if (!usb_device || !usb_device->chip_info ||
132  usb_device->chip_ops != &drivers_usb_acpi_ops)
133  return false;
134 
135  config = usb_device->chip_info;
136  if (config->use_custom_pld)
137  *pld = config->custom_pld;
138  else
139  acpi_pld_fill_usb(pld, config->type, &config->group);
140 
141  return true;
142 }
void acpi_device_write_gpio(const struct acpi_gpio *gpio)
Definition: device.c:258
const char * acpi_device_path(const struct device *dev)
Definition: device.c:144
void acpi_device_add_power_res(const struct acpi_power_res_params *params)
Definition: device.c:646
void acpi_dp_write(struct acpi_dp *table)
Definition: device.c:898
struct acpi_dp * acpi_dp_add_gpio(struct acpi_dp *dp, const char *name, const char *ref, int index, int pin, int active_low)
Definition: device.c:1142
struct acpi_dp * acpi_dp_new_table(const char *name)
Definition: device.c:930
void acpigen_pop_len(void)
Definition: acpigen.c:37
void acpigen_write_scope(const char *name)
Definition: acpigen.c:326
void acpigen_write_resourcetemplate_footer(void)
Definition: acpigen.c:1165
void acpigen_write_resourcetemplate_header(void)
Definition: acpigen.c:1147
void acpigen_write_upc(enum acpi_upc_type type)
Definition: acpigen.c:1601
void acpigen_write_name(const char *name)
Definition: acpigen.c:320
void acpigen_write_name_string(const char *name, const char *string)
Definition: acpigen.c:176
void acpigen_write_pld(const struct acpi_pld *pld)
Definition: acpigen.c:1616
#define printk(level,...)
Definition: stdlib.h:16
const char * dev_path(const struct device *dev)
Definition: device_util.c:149
@ UPC_TYPE_HUB
Definition: acpi.h:1057
#define CHIP_NAME(X)
Definition: device.h:32
static void noop_read_resources(struct device *dev)
Standard device operations function pointers shims.
Definition: device.h:73
static void noop_set_resources(struct device *dev)
Definition: device.h:74
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
enum board_config config
Definition: memory.c:448
int acpi_pld_fill_usb(struct acpi_pld *pld, enum acpi_upc_type type, struct acpi_pld_group *group)
Definition: pld.c:8
void scan_static_bus(struct device *bus)
Definition: root_device.c:89
#define NULL
Definition: stddef.h:19
int pin_count
Definition: acpi_device.h:165
const char * name
Definition: device.h:29
void(* read_resources)(struct device *dev)
Definition: device.h:39
Definition: device.h:107
struct chip_operations * chip_ops
Definition: device.h:144
struct device_operations * ops
Definition: device.h:143
DEVTREE_CONST void * chip_info
Definition: device.h:164
struct acpi_gpio reset_gpio
Definition: chip.h:51
bool has_power_resource
Definition: chip.h:48
struct acpi_gpio privacy_gpio
Definition: chip.h:68
Definition: pinmux.c:36
static struct device_operations usb_acpi_ops
Definition: usb_acpi.c:110
static void usb_acpi_fill_ssdt_generator(const struct device *dev)
Definition: usb_acpi.c:36
static void usb_acpi_enable(struct device *dev)
Definition: usb_acpi.c:117
static int usb_acpi_write_gpio(struct acpi_gpio *gpio, int *curr_index)
Definition: usb_acpi.c:22
static bool usb_acpi_add_gpios_to_crs(struct drivers_usb_acpi_config *cfg)
Definition: usb_acpi.c:11
bool usb_acpi_get_pld(const struct device *usb_device, struct acpi_pld *pld)
Definition: usb_acpi.c:127
struct chip_operations drivers_usb_acpi_ops
Definition: usb_acpi.c:122