coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
edid.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 
3 #include <device/mmio.h>
4 #include <console/console.h>
5 #include <delay.h>
6 
7 #include "i915_reg.h"
8 #include "edid.h"
9 #define GMBUS0_ADDR (mmio + 4 * 0)
10 #define GMBUS1_ADDR (mmio + 4 * 1)
11 #define GMBUS2_ADDR (mmio + 4 * 2)
12 #define GMBUS3_ADDR (mmio + 4 * 3)
13 #define GMBUS5_ADDR (mmio + 4 * 8)
14 #define AT24_ADDR 0x50 /* EDID EEPROM */
15 
16 static void wait_rdy(u8 *mmio)
17 {
18  unsigned int try = 100;
19 
20  while (try--) {
22  return;
23  udelay(10);
24  }
25 }
26 
27 static void intel_gmbus_stop_bus(u8 *mmio, u8 bus)
28 {
29  wait_rdy(mmio);
31  wait_rdy(mmio);
32  write32(GMBUS5_ADDR, 0);
35  | GMBUS_SLAVE_READ | (AT24_ADDR << 1));
36  wait_rdy(mmio);
37  write32(GMBUS5_ADDR, 0);
39  write32(GMBUS1_ADDR, 0);
40  wait_rdy(mmio);
42  | (AT24_ADDR << 1));
43  wait_rdy(mmio);
46 }
47 
48 void intel_gmbus_stop(u8 *mmio)
49 {
50  intel_gmbus_stop_bus(mmio, 6);
51  intel_gmbus_stop_bus(mmio, 2);
52 }
53 
54 void intel_gmbus_read_edid(u8 *mmio, u8 bus, u8 slave, u8 *edid, u32 edid_size)
55 {
56  int i;
57 
58  slave &= 0x7f;
59  edid_size &= 0x1fc;
60 
61  wait_rdy(mmio);
62  /* 100 KHz, hold 0ns, */
64  wait_rdy(mmio);
65  /* Ensure index bits are disabled. */
66  write32(GMBUS5_ADDR, 0);
68  | (slave << 1));
69  wait_rdy(mmio);
70  /* Ensure index bits are disabled. */
71  write32(GMBUS5_ADDR, 0);
74  | (edid_size << GMBUS_BYTE_COUNT_SHIFT) | (slave << 1));
75  for (i = 0; i < edid_size / 4; i++) {
76  u32 reg32;
77  wait_rdy(mmio);
78  reg32 = read32(GMBUS3_ADDR);
79  edid[4 * i] = reg32 & 0xff;
80  edid[4 * i + 1] = (reg32 >> 8) & 0xff;
81  edid[4 * i + 2] = (reg32 >> 16) & 0xff;
82  edid[4 * i + 3] = (reg32 >> 24) & 0xff;
83  }
84  wait_rdy(mmio);
87  | (128 << GMBUS_BYTE_COUNT_SHIFT) | (slave << 1));
88  wait_rdy(mmio);
91 
92  printk (BIOS_SPEW, "EDID:\n");
93  for (i = 0; i < 128; i++) {
94  printk(BIOS_SPEW, " %02x", edid[i]);
95  if ((i & 0xf) == 0xf)
96  printk (BIOS_SPEW, "\n");
97  }
98 }
static void write32(void *addr, uint32_t val)
Definition: mmio.h:40
static uint32_t read32(const void *addr)
Definition: mmio.h:22
#define printk(level,...)
Definition: stdlib.h:16
#define GMBUS5_ADDR
Definition: edid.c:13
#define GMBUS1_ADDR
Definition: edid.c:10
#define GMBUS0_ADDR
Definition: edid.c:9
#define GMBUS2_ADDR
Definition: edid.c:11
static void wait_rdy(u8 *mmio)
Definition: edid.c:16
#define GMBUS3_ADDR
Definition: edid.c:12
void intel_gmbus_read_edid(u8 *mmio, u8 bus, u8 slave, u8 *edid, u32 edid_size)
Definition: edid.c:54
static void intel_gmbus_stop_bus(u8 *mmio, u8 bus)
Definition: edid.c:27
#define AT24_ADDR
Definition: edid.c:14
void intel_gmbus_stop(u8 *mmio)
Definition: edid.c:48
#define GMBUS_CYCLE_WAIT
Definition: i915_reg.h:846
#define GMBUS_HW_RDY
Definition: i915_reg.h:859
#define GMBUS_CYCLE_STOP
Definition: i915_reg.h:848
#define GMBUS_BYTE_COUNT_SHIFT
Definition: i915_reg.h:849
#define GMBUS_SLAVE_READ
Definition: i915_reg.h:852
#define GMBUS_SW_CLR_INT
Definition: i915_reg.h:842
#define GMBUS_SLAVE_WRITE
Definition: i915_reg.h:853
#define GMBUS_CYCLE_INDEX
Definition: i915_reg.h:847
#define GMBUS_INUSE
Definition: i915_reg.h:855
#define GMBUS_SW_RDY
Definition: i915_reg.h:843
#define BIOS_SPEW
BIOS_SPEW - Excessively verbose output.
Definition: loglevel.h:142
static struct spi_slave slave
Definition: spiconsole.c:7
uint32_t u32
Definition: stdint.h:51
uint8_t u8
Definition: stdint.h:45
Definition: device.h:76
Definition: edid.h:49
void udelay(uint32_t us)
Definition: udelay.c:15