blob: 12fe6427f01021e155fe05d62d7c175eba25391b [file] [log] [blame]
Lee Leahy77ff0b12015-05-05 15:07:29 -07001/*
2 * This file is part of the coreboot project.
3 *
Lee Leahy77ff0b12015-05-05 15:07:29 -07004 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; version 2 of the License.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
Lee Leahy77ff0b12015-05-05 15:07:29 -070013 */
14
Lee Leahy32471722015-04-20 15:20:28 -070015#include "chip.h"
Lee Leahy77ff0b12015-05-05 15:07:29 -070016#include <console/console.h>
Lee Leahy77ff0b12015-05-05 15:07:29 -070017#include <device/device.h>
18#include <device/pci.h>
19#include <device/pci_ids.h>
Matt DeVillier132bbe62017-07-01 13:02:47 -050020#include <drivers/intel/gma/opregion.h>
Matt DeVillier8ff2ecd2020-03-29 16:58:48 -050021#include <drivers/intel/gma/i915.h>
Lee Leahy77ff0b12015-05-05 15:07:29 -070022#include <reg_script.h>
Lee Leahy77ff0b12015-05-05 15:07:29 -070023#include <soc/gfx.h>
Matt DeVillier132bbe62017-07-01 13:02:47 -050024#include <soc/nvs.h>
Lee Leahy77ff0b12015-05-05 15:07:29 -070025#include <soc/pci_devs.h>
26#include <soc/ramstage.h>
27
Lee Leahy77ff0b12015-05-05 15:07:29 -070028static const struct reg_script gpu_pre_vbios_script[] = {
29 /* Make sure GFX is bus master with MMIO access */
30 REG_PCI_OR32(PCI_COMMAND, PCI_COMMAND_MASTER|PCI_COMMAND_MEMORY),
Lee Leahy77ff0b12015-05-05 15:07:29 -070031 REG_SCRIPT_END
32};
33
34static const struct reg_script gfx_post_vbios_script[] = {
Lee Leahy77ff0b12015-05-05 15:07:29 -070035 /* Set Lock bits */
Angel Ponsaee7ab22020-03-19 00:31:58 +010036 REG_PCI_RMW32(GGC, 0xffffffff, GGC_GGCLCK),
Lee Leahy32471722015-04-20 15:20:28 -070037 REG_PCI_RMW32(GSM_BASE, 0xffffffff, GSM_BDSM_LOCK),
38 REG_PCI_RMW32(GTT_BASE, 0xffffffff, GTT_BGSM_LOCK),
Lee Leahy77ff0b12015-05-05 15:07:29 -070039 REG_SCRIPT_END
40};
41
Angel Ponsaee7ab22020-03-19 00:31:58 +010042static inline void gfx_run_script(struct device *dev, const struct reg_script *ops)
Lee Leahy77ff0b12015-05-05 15:07:29 -070043{
44 reg_script_run_on_dev(dev, ops);
45}
46
Elyes HAOUASb13fac32018-05-24 22:29:44 +020047static void gfx_pre_vbios_init(struct device *dev)
Lee Leahy77ff0b12015-05-05 15:07:29 -070048{
Angel Ponsaee7ab22020-03-19 00:31:58 +010049 printk(BIOS_SPEW, "%s/%s (%s)\n", __FILE__, __func__, dev_name(dev));
Lee Leahy77ff0b12015-05-05 15:07:29 -070050 printk(BIOS_INFO, "GFX: Pre VBIOS Init\n");
51 gfx_run_script(dev, gpu_pre_vbios_script);
52}
53
Elyes HAOUASb13fac32018-05-24 22:29:44 +020054static void gfx_post_vbios_init(struct device *dev)
Lee Leahy77ff0b12015-05-05 15:07:29 -070055{
Angel Ponsaee7ab22020-03-19 00:31:58 +010056 printk(BIOS_SPEW, "%s/%s (%s)\n", __FILE__, __func__, dev_name(dev));
Lee Leahy77ff0b12015-05-05 15:07:29 -070057 printk(BIOS_INFO, "GFX: Post VBIOS Init\n");
58 gfx_run_script(dev, gfx_post_vbios_script);
59}
60
Elyes HAOUASb13fac32018-05-24 22:29:44 +020061static void gfx_init(struct device *dev)
Lee Leahy77ff0b12015-05-05 15:07:29 -070062{
Angel Ponsaee7ab22020-03-19 00:31:58 +010063 printk(BIOS_SPEW, "%s/%s (%s)\n", __FILE__, __func__, dev_name(dev));
Lee Leahy32471722015-04-20 15:20:28 -070064
Julius Wernercd49cce2019-03-05 16:53:33 -080065 if (!CONFIG(RUN_FSP_GOP)) {
Matt DeVilliera9492a62018-06-20 00:40:48 -050066 /* Pre VBIOS Init */
67 gfx_pre_vbios_init(dev);
Lee Leahy77ff0b12015-05-05 15:07:29 -070068
Matt DeVilliera9492a62018-06-20 00:40:48 -050069 /* Run VBIOS */
70 pci_dev_init(dev);
Lee Leahy77ff0b12015-05-05 15:07:29 -070071
Matt DeVilliera9492a62018-06-20 00:40:48 -050072 /* Post VBIOS Init */
73 gfx_post_vbios_init(dev);
74 }
Matt DeVillier132bbe62017-07-01 13:02:47 -050075 intel_gma_restore_opregion();
76}
77
78uintptr_t gma_get_gnvs_aslb(const void *gnvs)
79{
80 const global_nvs_t *gnvs_ptr = gnvs;
81 return (uintptr_t)(gnvs_ptr ? gnvs_ptr->aslb : 0);
82}
83
84void gma_set_gnvs_aslb(void *gnvs, uintptr_t aslb)
85{
86 global_nvs_t *gnvs_ptr = gnvs;
87 if (gnvs_ptr)
88 gnvs_ptr->aslb = aslb;
Lee Leahy77ff0b12015-05-05 15:07:29 -070089}
90
Matt DeVillier8ff2ecd2020-03-29 16:58:48 -050091static void gma_generate_ssdt(struct device *dev)
92{
93 const struct soc_intel_braswell_config *chip = dev->chip_info;
94
95 drivers_intel_gma_displays_ssdt_generate(&chip->gfx);
96}
97
Lee Leahy77ff0b12015-05-05 15:07:29 -070098static struct device_operations gfx_device_ops = {
Nico Huber1ef80142015-11-05 23:27:06 +010099 .read_resources = pci_dev_read_resources,
Lee Leahy77ff0b12015-05-05 15:07:29 -0700100 .set_resources = pci_dev_set_resources,
101 .enable_resources = pci_dev_enable_resources,
102 .init = gfx_init,
103 .ops_pci = &soc_pci_ops,
Matt DeVillier8ff2ecd2020-03-29 16:58:48 -0500104 .acpi_fill_ssdt = gma_generate_ssdt,
Lee Leahy77ff0b12015-05-05 15:07:29 -0700105};
106
107static const struct pci_driver gfx_driver __pci_driver = {
108 .ops = &gfx_device_ops,
109 .vendor = PCI_VENDOR_ID_INTEL,
110 .device = GFX_DEVID,
111};