coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
graphics.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
3 #include <acpi/acpi_device.h>
4 #include <acpi/acpigen.h>
5 #include <boot/coreboot_tables.h>
6 #include <device/pci.h>
7 #include <device/pci_ids.h>
8 #include <console/console.h>
9 #include <fsp/graphics.h>
10 #include <soc/intel/common/vbt.h>
11 #include <timestamp.h>
12 
13 #define ATIF_FUNCTION_VERIFY_INTERFACE 0x0
15  uint16_t size; /* Size of this object, including size field */
18  uint32_t supported_functions; /* Bit n set if function n+1 supported. */
19 };
20 
21 #define ATIF_FUNCTION_QUERY_BRIGHTNESS_TRANSFER_CHARACTERISTICS 0x10
22 # define ATIF_QBTC_REQUEST_LCD1 0
23 /* error codes */
24 # define ATIF_QBTC_ERROR_CODE_SUCCESS 0
25 # define ATIF_QBTC_ERROR_CODE_FAILURE 1
26 # define ATIF_QBTC_ERROR_CODE_DEVICE_NOT_SUPPORTED 2
29  /* ATIF doc indicates this field is a word, but the kernel drivers uses a byte. */
31 };
33  uint16_t size; /* Size of this object, including size field. */
34  uint16_t flags; /* Currently all reserved. */
36  /* default brightness fields currently ignored by Linux driver. */
37  uint8_t default_brightness_ac; /* Percentage brightness when connected to AC. */
38  uint8_t default_brightness_dc; /* Percentage brightness when connected to DC. */
39  /* The following 2 fields are the only ones honored by Linux driver currently. */
40  uint8_t min_input_signal_level; /* 0-255 corresponding to 0% */
41  uint8_t max_input_signal_level; /* 0-255 corresponding to 100% */
42  /* Array of data points consisting of:
43  * { uint8_t luminance_level; (percent)
44  * uint8_t input_signal_level; (0-255 in value) }
45  * Linux ignores these fields so no support currently. */
46  uint8_t count_data_points; /* Count of data points. */
47 };
48 
49 static void generate_atif(const struct device *dev)
50 {
51  struct atif_verify_interface_output verify_output = {
52  .size = sizeof(verify_output),
53  .version = 1,
56  };
57  struct atif_brightness_output brightness_error = {
58  .size = sizeof(brightness_error),
60  };
61  struct atif_brightness_output brightness_out = {
62  .size = sizeof(brightness_out),
66  };
67 
68  /* Scope (\_SB.PCI0.PBRA.IGFX) */
70  /* Method (ATIF, 2, NotSerialized) */
71  acpigen_write_method("ATIF", 2);
72  /* ToInteger (Arg0, Local0) */
74 
75  /* If ((Local0 == Zero)) */
77  /* Return (Buffer (0x0C) { ... } */
78  acpigen_write_return_byte_buffer((uint8_t *)(void *)&verify_output,
79  sizeof(verify_output));
80 
81  /* ElseIf ((Local0 == 0x10)) */
85  /* CreateByteField (Arg1, 0x02, DISP) */
87  offsetof(struct atif_brightness_input, requested_display), "DISP");
88  /* ToInteger (DISP, Local1) */
90  /* If ((Local1 == Zero)) */
92  /* Return (Buffer (0x0A) { ... } */
93  acpigen_write_return_byte_buffer((uint8_t *)(void *)&brightness_out,
94  sizeof(brightness_out));
95  /* Else */
97  /* Return (Buffer (0x0A) */
98  acpigen_write_return_byte_buffer((uint8_t *)(void *)&brightness_error,
99  sizeof(brightness_error));
100  acpigen_pop_len(); /* else */
101 
102  acpigen_pop_len(); /* if (LEqual(Local0, 0x10) */
103  acpigen_pop_len(); /* else */
104 
105  acpigen_pop_len(); /* Method */
106  acpigen_pop_len(); /* Scope */
107 }
108 
109 static void graphics_fill_ssdt(const struct device *dev)
110 {
112 
113  /* Use the VFCT copy when using GOP */
114  if (!CONFIG(RUN_FSP_GOP))
115  pci_rom_ssdt(dev);
116 
117  if (CONFIG(SOC_AMD_COMMON_BLOCK_GRAPHICS_ATIF))
118  generate_atif(dev);
119 }
120 
121 static const char *graphics_acpi_name(const struct device *dev)
122 {
123  return "IGFX";
124 }
125 
126 /*
127  * Even though AMD does not need VBT we still need to implement the
128  * vbt_get() function to not break the build with GOP driver enabled
129  * (see fsps_return_value_handler() in fsp2_0/silicon_init.c
130  */
131 void *vbt_get(void)
132 {
133  return NULL;
134 }
135 
136 static void graphics_set_resources(struct device *const dev)
137 {
138  struct rom_header *rom, *ram;
139 
141 
142  if (!CONFIG(RUN_FSP_GOP))
143  return;
144 
146  rom = pci_rom_probe(dev);
147  if (rom == NULL)
148  return;
149  ram = pci_rom_load(dev, rom);
150  if (ram == NULL)
151  return;
153 }
154 
155 static void graphics_dev_init(struct device *const dev)
156 {
157  if (CONFIG(RUN_FSP_GOP)) {
158  struct resource *res = probe_resource(dev, PCI_BASE_ADDRESS_0);
159 
160  if (res && res->base)
162  else
163  printk(BIOS_ERR, "%s: Unable to find resource for %s\n",
164  __func__, dev_path(dev));
165  }
166 
167  /* Initialize PCI device, load/execute BIOS Option ROM */
168  pci_dev_init(dev);
169 }
170 
171 static const struct device_operations graphics_ops = {
173  .set_resources = graphics_set_resources,
174  .enable_resources = pci_dev_enable_resources,
175  .init = graphics_dev_init,
176  .scan_bus = scan_static_bus,
177  .ops_pci = &pci_dev_ops_pci,
178  .write_acpi_tables = pci_rom_write_acpi_tables,
179  .acpi_fill_ssdt = graphics_fill_ssdt,
180  .acpi_name = graphics_acpi_name,
181 };
182 
183 static const unsigned short pci_device_ids[] = {
190  0,
191 };
192 
193 static const struct pci_driver graphics_driver __pci_driver = {
194  .ops = &graphics_ops,
195  .vendor = PCI_VID_ATI,
196  .devices = pci_device_ids,
197 };
const char * acpi_device_path(const struct device *dev)
Definition: device.c:144
void acpi_device_write_pci_dev(const struct device *dev)
Definition: device.c:1168
void acpigen_pop_len(void)
Definition: acpigen.c:37
void acpigen_write_to_integer_from_namestring(const char *source, uint8_t dst_op)
Definition: acpigen.c:1539
void acpigen_write_scope(const char *name)
Definition: acpigen.c:326
void acpigen_write_if_lequal_op_int(uint8_t op, uint64_t val)
Definition: acpigen.c:1472
void acpigen_write_create_byte_field(uint8_t op, size_t byte_offset, const char *name)
Definition: acpigen.c:2169
void acpigen_write_to_integer(uint8_t src, uint8_t dst)
Definition: acpigen.c:1532
void acpigen_write_return_byte_buffer(uint8_t *arr, size_t size)
Definition: acpigen.c:1560
void acpigen_write_method(const char *name, int nargs)
Definition: acpigen.c:758
void acpigen_write_else(void)
Definition: acpigen.c:1510
#define offsetof(TYPE, MEMBER)
Definition: helpers.h:84
@ LB_FB_ORIENTATION_NORMAL
#define printk(level,...)
Definition: stdlib.h:16
struct resource * probe_resource(const struct device *dev, unsigned int index)
See if a resource structure already exists for a given index.
Definition: device_util.c:323
const char * dev_path(const struct device *dev)
Definition: device_util.c:149
void fsp_report_framebuffer_info(const uintptr_t framebuffer_bar, enum lb_fb_orientation orientation)
Definition: graphics.c:52
@ CONFIG
Definition: dsi_common.h:201
#define BIT(nr)
Definition: ec_commands.h:45
@ ARG0_OP
Definition: acpigen.h:89
@ ARG1_OP
Definition: acpigen.h:90
@ LOCAL1_OP
Definition: acpigen.h:82
@ LOCAL0_OP
Definition: acpigen.h:81
unsigned int version[2]
Definition: edid.c:55
void timestamp_add_now(enum timestamp_id id)
Definition: timestamp.c:141
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
#define PCI_BASE_ADDRESS_0
Definition: pci_def.h:63
void pci_dev_init(struct device *dev)
Default handler: only runs the relevant PCI BIOS.
Definition: pci_device.c:873
void pci_dev_enable_resources(struct device *dev)
Definition: pci_device.c:721
void pci_dev_read_resources(struct device *dev)
Definition: pci_device.c:534
struct pci_operations pci_dev_ops_pci
Default device operation for PCI devices.
Definition: pci_device.c:911
void pci_dev_set_resources(struct device *dev)
Definition: pci_device.c:691
#define PCI_DID_ATI_FAM17H_MODEL18H_GPU
Definition: pci_ids.h:374
#define PCI_DID_ATI_FAM19H_MODEL51H_GPU_BARCELO
Definition: pci_ids.h:379
#define PCI_DID_ATI_FAM17H_MODEL60H_GPU
Definition: pci_ids.h:375
#define PCI_VID_ATI
Definition: pci_ids.h:204
#define PCI_DID_ATI_FAM19H_MODEL51H_GPU_CEZANNE
Definition: pci_ids.h:378
#define PCI_DID_ATI_FAM17H_MODELA0H_GPU
Definition: pci_ids.h:377
#define PCI_DID_ATI_FAM17H_MODEL68H_GPU
Definition: pci_ids.h:376
struct rom_header * pci_rom_load(struct device *dev, struct rom_header *rom_header)
Definition: pci_rom.c:153
struct rom_header * pci_rom_probe(const struct device *dev)
Definition: pci_rom.c:52
unsigned long pci_rom_write_acpi_tables(const struct device *device, unsigned long current, struct acpi_rsdp *rsdp)
void pci_rom_ssdt(const struct device *device)
void scan_static_bus(struct device *bus)
Definition: root_device.c:89
void * vbt_get(void)
Definition: graphics.c:131
#define ATIF_FUNCTION_QUERY_BRIGHTNESS_TRANSFER_CHARACTERISTICS
Definition: graphics.c:21
#define ATIF_QBTC_ERROR_CODE_SUCCESS
Definition: graphics.c:24
static const struct pci_driver graphics_driver __pci_driver
Definition: graphics.c:193
#define ATIF_FUNCTION_VERIFY_INTERFACE
Definition: graphics.c:13
#define ATIF_QBTC_ERROR_CODE_DEVICE_NOT_SUPPORTED
Definition: graphics.c:26
#define ATIF_QBTC_REQUEST_LCD1
Definition: graphics.c:22
static const unsigned short pci_device_ids[]
Definition: graphics.c:183
static void graphics_fill_ssdt(const struct device *dev)
Definition: graphics.c:109
static const char * graphics_acpi_name(const struct device *dev)
Definition: graphics.c:121
static void generate_atif(const struct device *dev)
Definition: graphics.c:49
static const struct device_operations graphics_ops
Definition: graphics.c:171
static void graphics_dev_init(struct device *const dev)
Definition: graphics.c:155
static void graphics_set_resources(struct device *const dev)
Definition: graphics.c:136
#define NULL
Definition: stddef.h:19
unsigned short uint16_t
Definition: stdint.h:11
unsigned int uint32_t
Definition: stdint.h:14
unsigned char uint8_t
Definition: stdint.h:8
uint8_t requested_display
Definition: graphics.c:30
uint8_t min_input_signal_level
Definition: graphics.c:40
uint8_t default_brightness_dc
Definition: graphics.c:38
uint8_t default_brightness_ac
Definition: graphics.c:37
uint8_t count_data_points
Definition: graphics.c:46
uint8_t max_input_signal_level
Definition: graphics.c:41
uint32_t supported_notifications
Definition: graphics.c:17
void(* read_resources)(struct device *dev)
Definition: device.h:39
Definition: device.h:107
resource_t base
Definition: resource.h:45
@ TS_OPROM_INITIALIZE
@ TS_OPROM_COPY_END