coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
gma.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <arch/io.h>
4 #include <device/mmio.h>
5 #include <console/console.h>
6 #include <delay.h>
7 #include <device/device.h>
8 #include <device/pci.h>
9 #include <device/pci_def.h>
10 #include <device/pci_ids.h>
11 #include <device/pci_ops.h>
14 #include <drivers/intel/gma/i915.h>
16 #include <pc80/vga.h>
17 #include <pc80/vga_io.h>
18 #include <types.h>
19 
20 #include "chip.h"
21 #include "pineview.h"
22 
23 #define GTTSIZE (512 * 1024)
24 
25 #define PGETBL2_CTL 0x20c4
26 #define PGETBL2_1MB (1 << 8)
27 
28 #define PGETBL_CTL 0x2020
29 #define PGETBL_1MB (3 << 1)
30 #define PGETBL_512KB 0
31 #define PGETBL_ENABLED 0x1
32 
33 #define ADPA_HOTPLUG_BITS (ADPA_CRT_HOTPLUG_PERIOD_128 | \
34  ADPA_CRT_HOTPLUG_WARMUP_10MS | \
35  ADPA_CRT_HOTPLUG_MONITOR_COLOR| \
36  ADPA_CRT_HOTPLUG_SAMPLE_4S | \
37  ADPA_CRT_HOTPLUG_VOLTAGE_50 | \
38  ADPA_CRT_HOTPLUG_VOLREF_325MV | \
39  ADPA_CRT_HOTPLUG_ENABLE)
40 
41 static struct resource *gtt_res = NULL;
42 static struct resource *mmio_res = NULL;
43 
44 static int gtt_setup(u8 *mmiobase)
45 {
46  u32 gttbase;
47  struct device *dev = pcidev_on_root(0, 0);
48 
49  gttbase = pci_read_config32(dev, BGSM);
50  printk(BIOS_DEBUG, "gttbase = %08x\n", gttbase);
51 
52  write32(mmiobase + PGETBL_CTL, gttbase | PGETBL_512KB);
53  udelay(50);
54  write32(mmiobase + PGETBL_CTL, gttbase | PGETBL_512KB);
55 
56  write32(mmiobase + GFX_FLSH_CNTL, 0);
57 
58  return 0;
59 }
60 
62  struct device *vga, u8 *mmio, u8 *gtt, u32 physbase, u16 piobase)
63 {
64  int i;
65  u32 hactive, vactive;
66  u32 temp;
67 
68  printk(BIOS_SPEW, "gtt %x mmio %x addrport %x physbase %x\n",
69  (u32)gtt, (u32)mmio, piobase, physbase);
70 
71  gtt_setup(mmio);
72 
73  pci_write_config16(vga, GGC, 0x130);
74 
75  /* Disable VGA. */
77 
78  /* Disable pipes. */
79  write32(mmio + PIPECONF(0), 0);
80  write32(mmio + PIPECONF(1), 0);
81 
82  write32(mmio + INSTPM, 0x800);
83 
84  vga_gr_write(0x18, 0);
85 
86  write32(mmio + VGA0, 0x200074);
87  write32(mmio + VGA1, 0x200074);
88 
89  write32(mmio + DSPFW3, 0x7f3f00c1 & ~PINEVIEW_SELF_REFRESH_EN);
90  write32(mmio + DSPCLK_GATE_D, 0);
91  write32(mmio + FW_BLC, 0x03060106);
92  write32(mmio + FW_BLC2, 0x00000306);
93 
100  | ADPA_DPMS_ON);
101 
102  write32(mmio + 0x7041c, 0x0);
103 
104  write32(mmio + DPLL_MD(0), 0x3);
105  write32(mmio + DPLL_MD(1), 0x3);
106  write32(mmio + DSPCNTR(1), 0x1000000);
107  write32(mmio + PIPESRC(1), 0x027f01df);
108 
109  vga_misc_write(0x67);
110  const u8 cr[25] = {
111  0x5f, 0x4f, 0x50, 0x82, 0x55,
112  0x81, 0xbf, 0x1f, 0x00, 0x4f,
113  0x0d, 0x0e, 0x00, 0x00, 0x00,
114  0x00, 0x9c, 0x8e, 0x8f, 0x28,
115  0x1f, 0x96, 0xb9, 0xa3, 0xff,
116  };
117  vga_cr_write(0x11, 0);
118 
119  for (i = 0; i < ARRAY_SIZE(cr); i++)
120  vga_cr_write(i, cr[i]);
121 
122  // Disable screen memory to prevent garbage from appearing.
123  vga_sr_write(1, vga_sr_read(1) | 0x20);
124  hactive = 640;
125  vactive = 400;
126 
127  mdelay(1);
128  write32(mmio + DPLL(0),
132  | 0x400601);
133 
134  mdelay(1);
135  write32(mmio + DPLL(0),
139  | 0x400601);
140 
147  | ADPA_DPMS_ON);
148 
149  write32(mmio + HTOTAL(1), 0x031f027f);
150  write32(mmio + HBLANK(1), 0x03170287);
151  write32(mmio + HSYNC(1), 0x02ef028f);
152  write32(mmio + VTOTAL(1), 0x020c01df);
153  write32(mmio + VBLANK(1), 0x020401e7);
154  write32(mmio + VSYNC(1), 0x01eb01e9);
155 
156  write32(mmio + HTOTAL(0), ((hactive - 1) << 16) | (hactive - 1));
157  write32(mmio + HBLANK(0), ((hactive - 1) << 16) | (hactive - 1));
158  write32(mmio + HSYNC(0), ((hactive - 1) << 16) | (hactive - 1));
159  write32(mmio + VTOTAL(0), ((vactive - 1) << 16) | (vactive - 1));
160  write32(mmio + VBLANK(0), ((vactive - 1) << 16) | (vactive - 1));
161  write32(mmio + VSYNC(0), ((vactive - 1) << 16) | (vactive - 1));
162 
163  write32(mmio + PF_WIN_POS(0), 0);
164 
165  write32(mmio + PIPESRC(0), (639 << 16) | 399);
167  write32(mmio + PF_WIN_SZ(0), vactive | (hactive << 16));
168  write32(mmio + PFIT_CONTROL, 0x0);
169 
170  mdelay(1);
171 
172  write32(mmio + FDI_RX_CTL(0), 0x00002040);
173  mdelay(1);
174  write32(mmio + FDI_RX_CTL(0), 0x80002050);
175  write32(mmio + FDI_TX_CTL(0), 0x00044000);
176  mdelay(1);
177  write32(mmio + FDI_TX_CTL(0), 0x80044000);
179 
180  write32(mmio + VGACNTRL, 0x0);
182  mdelay(1);
183 
190  | ADPA_DPMS_ON);
191 
192  write32(mmio + DSPFW3, 0x7f3f00c1);
193  write32(mmio + MI_MODE, 0x200 | VS_TIMER_DISPATCH);
194  write32(mmio + CACHE_MODE_0, (0x6820 | (1 << 9)) & ~(1 << 5));
195  write32(mmio + CACHE_MODE_1, 0x380 & ~(1 << 9));
196 
197  for (i = 0; i < (8192 - 512) / 4; i++) {
198  outl((i << 2) | 1, piobase);
199  outl(physbase + (i << 12) + 1, piobase + 4);
200  }
201 
202  temp = read32(mmio + PGETBL_CTL);
203  printk(BIOS_INFO, "GTT PGETBL_CTL register : 0x%08x\n", temp);
204  temp = read32(mmio + PGETBL2_CTL);
205  printk(BIOS_INFO, "GTT PGETBL2_CTL register: 0x%08x\n", temp);
206 
207  /* Clear interrupts */
208  write32(mmio + DEIIR, 0xffffffff);
209  write32(mmio + SDEIIR, 0xffffffff);
210  write32(mmio + IIR, 0xffffffff);
211  write32(mmio + IMR, 0xffffffff);
212  write32(mmio + EIR, 0xffffffff);
213 
215 
216  /* Enable screen memory */
217  vga_sr_write(1, vga_sr_read(1) & ~0x20);
218 }
219 
220 static void gma_func0_init(struct device *dev)
221 {
223 
224  if (!CONFIG(NO_GFX_INIT))
226 
227  if (!CONFIG(MAINBOARD_DO_NATIVE_VGA_INIT)) {
228  /* PCI init, will run VBIOS */
229  pci_dev_init(dev);
230  } else {
231  u32 physbase;
232  struct resource *pio_res;
233  struct northbridge_intel_pineview_config *conf = dev->chip_info;
234 
235  int vga_disable = (pci_read_config16(dev, GGC) & 2) >> 1;
236 
237  /* Find base addresses */
240  pio_res = find_resource(dev, PCI_BASE_ADDRESS_1);
241  physbase = pci_read_config32(dev, 0x5c) & ~0xf;
242 
243  if (gtt_res && gtt_res->base && physbase && pio_res && pio_res->base) {
244  if (vga_disable) {
245  printk(BIOS_INFO, "IGD is not decoding legacy VGA MEM and IO: "
246  "skipping NATIVE graphic init\n");
247  } else {
248  printk(BIOS_SPEW, "Initializing VGA. MMIO 0x%llx\n",
249  mmio_res->base);
250  intel_gma_init(conf, dev,
251  res2mmio(mmio_res, 0, 0),
252  res2mmio(gtt_res, 0, 0),
253  physbase, pio_res->base);
254  }
255  }
256 
257  /* Linux relies on VBT for panel info. */
258  generate_fake_intel_oprom(&conf->gfx, dev, "$VBT PINEVIEW");
259  }
260 }
261 
262 static const char *gma_acpi_name(const struct device *dev)
263 {
264  return "GFX0";
265 }
266 
267 static struct device_operations gma_func0_ops = {
269  .set_resources = pci_dev_set_resources,
270  .enable_resources = pci_dev_enable_resources,
271  .init = gma_func0_init,
272  .ops_pci = &pci_dev_ops_pci,
273  .acpi_name = gma_acpi_name,
274 };
275 
276 static const unsigned short pci_device_ids[] =
277 {
278  0xa001, 0,
279 };
280 
281 static const struct pci_driver gma __pci_driver = {
282  .ops = &gma_func0_ops,
283  .vendor = PCI_VID_INTEL,
284  .devices = pci_device_ids,
285 };
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
static uint32_t read32(const void *addr)
Definition: mmio.h:22
#define ARRAY_SIZE(a)
Definition: helpers.h:12
#define printk(level,...)
Definition: stdlib.h:16
void mdelay(unsigned int msecs)
Definition: delay.c:2
void outl(u32 val, u16 port)
DEVTREE_CONST struct device * pcidev_on_root(uint8_t dev, uint8_t fn)
Definition: device_const.c:260
struct resource * find_resource(const struct device *dev, unsigned int index)
Return an existing resource structure for a given index.
Definition: device_util.c:394
static struct smmstore_params_info info
Definition: ramstage.c:12
@ CONFIG
Definition: dsi_common.h:201
#define GGC
Definition: host_bridge.h:9
#define BGSM
Definition: host_bridge.h:59
void generate_fake_intel_oprom(const struct i915_gpu_controller_info *conf, struct device *dev, const char *idstr)
Definition: vbt.c:62
#define ADPA_USE_VGA_HVPOLARITY
Definition: i915_reg.h:1289
#define PF_CTL(pipe)
Definition: i915_reg.h:3073
#define PF_WIN_POS(pipe)
Definition: i915_reg.h:3075
#define EIR
Definition: i915_reg.h:550
#define IMR
Definition: i915_reg.h:523
#define DPLL_VGA_MODE_DIS
Definition: i915_reg.h:895
#define VS_TIMER_DISPATCH
Definition: i915_reg.h:500
#define CACHE_MODE_0
Definition: i915_reg.h:637
#define HSYNC(trans)
Definition: i915_reg.h:1251
#define GFX_FLSH_CNTL
Definition: i915_reg.h:647
#define VGACNTRL
Definition: i915_reg.h:2958
#define SDEIIR
Definition: i915_reg.h:3283
#define ADPA_VSYNC_CNTL_ENABLE
Definition: i915_reg.h:1292
#define ADPA_DAC_ENABLE
Definition: i915_reg.h:1263
#define HTOTAL(trans)
Definition: i915_reg.h:1249
#define PIPECONF_DITHER_EN
Definition: i915_reg.h:2401
#define DPLL_DAC_SERIAL_P2_CLOCK_DIV_10
Definition: i915_reg.h:899
#define VGA_DISP_DISABLE
Definition: i915_reg.h:2959
#define PF_WIN_SZ(pipe)
Definition: i915_reg.h:3074
#define IIR
Definition: i915_reg.h:522
#define DPLLB_MODE_DAC_SERIAL
Definition: i915_reg.h:896
#define DEIIR
Definition: i915_reg.h:3132
#define INSTPM
Definition: i915_reg.h:558
#define HBLANK(trans)
Definition: i915_reg.h:1250
#define VGA1
Definition: i915_reg.h:877
#define DPLL(pipe)
Definition: i915_reg.h:889
#define DPLL_MD(pipe)
Definition: i915_reg.h:1007
#define PF_FILTER_MED_3x3
Definition: i915_reg.h:3061
#define VSYNC(trans)
Definition: i915_reg.h:1254
#define FDI_RX_CTL(pipe)
Definition: i915_reg.h:3632
#define PIPECONF(tran)
Definition: i915_reg.h:2451
#define DISPPLANE_BGRX888
Definition: i915_reg.h:2728
#define FW_BLC
Definition: i915_reg.h:563
#define PIPECONF_ENABLE
Definition: i915_reg.h:2368
#define FDI_TX_CTL(pipe)
Definition: i915_reg.h:3581
#define PFIT_CONTROL
Definition: i915_reg.h:1552
#define MI_MODE
Definition: i915_reg.h:499
#define DPLL_VCO_ENABLE
Definition: i915_reg.h:890
#define VTOTAL(trans)
Definition: i915_reg.h:1252
#define VBLANK(trans)
Definition: i915_reg.h:1253
#define FW_BLC2
Definition: i915_reg.h:564
#define ADPA
Definition: i915_reg.h:1259
#define ADPA_PIPE_A_SELECT
Definition: i915_reg.h:1266
#define DSPFW3
Definition: i915_reg.h:2511
#define ADPA_DPMS_ON
Definition: i915_reg.h:1300
#define PIPECONF_BPP_6
Definition: i915_reg.h:2399
#define VGA0
Definition: i915_reg.h:876
#define DISPLAY_PLANE_ENABLE
Definition: i915_reg.h:2718
#define PF_ENABLE
Definition: i915_reg.h:3056
#define DSPCLK_GATE_D
Definition: i915_reg.h:1039
#define ADPA_HSYNC_CNTL_ENABLE
Definition: i915_reg.h:1294
#define DSPCNTR(plane)
Definition: i915_reg.h:2759
#define PINEVIEW_SELF_REFRESH_EN
Definition: i915_reg.h:2514
#define CACHE_MODE_1
Definition: i915_reg.h:654
#define PIPESRC(pipe)
Definition: i915_reg.h:2450
static __always_inline void pci_or_config16(const struct device *dev, u16 reg, u16 ormask)
Definition: pci_ops.h:180
static __always_inline u16 pci_read_config16(const struct device *dev, u16 reg)
Definition: pci_ops.h:52
static __always_inline u32 pci_read_config32(const struct device *dev, u16 reg)
Definition: pci_ops.h:58
static __always_inline void pci_write_config16(const struct device *dev, u16 reg, u16 val)
Definition: pci_ops.h:70
#define BIOS_INFO
BIOS_INFO - Expected events.
Definition: loglevel.h:113
#define BIOS_DEBUG
BIOS_DEBUG - Verbose output.
Definition: loglevel.h:128
#define BIOS_SPEW
BIOS_SPEW - Excessively verbose output.
Definition: loglevel.h:142
static const char * gma_acpi_name(const struct device *dev)
Definition: gma.c:262
#define PGETBL_CTL
Definition: gma.c:28
static struct resource * gtt_res
Definition: gma.c:41
static void gma_func0_init(struct device *dev)
Definition: gma.c:220
static const struct pci_driver gma __pci_driver
Definition: gma.c:281
static const unsigned short pci_device_ids[]
Definition: gma.c:276
#define ADPA_HOTPLUG_BITS
Definition: gma.c:33
static struct device_operations gma_func0_ops
Definition: gma.c:267
#define PGETBL_512KB
Definition: gma.c:30
static struct resource * mmio_res
Definition: gma.c:42
#define PGETBL2_CTL
Definition: gma.c:25
static void intel_gma_init(const struct northbridge_intel_pineview_config *info, struct device *vga, u8 *mmio, u8 *gtt, u32 physbase, u16 piobase)
Definition: gma.c:61
static int gtt_setup(u8 *mmiobase)
Definition: gma.c:44
enum cb_err intel_gma_init_igd_opregion(void)
Definition: opregion.c:310
#define PCI_COMMAND_MASTER
Definition: pci_def.h:13
#define PCI_BASE_ADDRESS_0
Definition: pci_def.h:63
#define PCI_COMMAND
Definition: pci_def.h:10
#define PCI_BASE_ADDRESS_1
Definition: pci_def.h:64
#define PCI_BASE_ADDRESS_3
Definition: pci_def.h:66
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_VID_INTEL
Definition: pci_ids.h:2157
static void * res2mmio(const struct resource *res, unsigned long offset, unsigned long mask)
Definition: resource.h:87
#define NULL
Definition: stddef.h:19
uint32_t u32
Definition: stdint.h:51
uint16_t u16
Definition: stdint.h:48
uint8_t u8
Definition: stdint.h:45
void(* read_resources)(struct device *dev)
Definition: device.h:39
Definition: device.h:107
DEVTREE_CONST void * chip_info
Definition: device.h:164
struct i915_gpu_controller_info gfx
Definition: chip.h:13
resource_t base
Definition: resource.h:45
void udelay(uint32_t us)
Definition: udelay.c:15
void vga_textmode_init(void)
Definition: vga.c:280
void vga_misc_write(unsigned char value)
Definition: vga_io.c:70
unsigned char vga_sr_read(unsigned char index)
Definition: vga_io.c:90
void vga_gr_write(unsigned char index, unsigned char value)
Definition: vga_io.c:189
void vga_cr_write(unsigned char index, unsigned char value)
Definition: vga_io.c:125
void vga_sr_write(unsigned char index, unsigned char value)
Definition: vga_io.c:97