1
2
3
4
5
6
7
8
9
10
11
12
13
14#ifndef DEVICE_LIB_H
15#define DEVICE_LIB_H
16
17#include <types.h>
18#ifdef CONFIG_COREBOOT_V2
19#include <arch/byteorder.h>
20#include "compat/of.h"
21#else
22#include <cpu.h>
23#include <byteorder.h>
24#include "of.h"
25#endif
26#include "debug.h"
27
28
29
30typedef struct {
31 char signature[4];
32 u8 structure_revision;
33 u8 length;
34 u16 next_header_offset;
35 u8 reserved;
36 u8 checksum;
37 u32 device_id;
38 u16 p_manufacturer_string;
39 u16 p_product_string;
40 u8 device_base_type;
41 u8 device_sub_type;
42 u8 device_if_type;
43 u8 device_indicators;
44
45 u16 bcv;
46 u16 dv;
47 u16 bev;
48 u16 reserved_2;
49 u16 sriv;
50} __attribute__ ((__packed__)) exp_header_struct_t;
51
52
53typedef struct {
54 u8 signature[4];
55 u16 vendor_id;
56 u16 device_id;
57 u16 reserved;
58 u16 pci_ds_length;
59 u8 pci_ds_revision;
60 u8 class_code[3];
61 u16 img_length;
62 u16 img_revision;
63 u8 code_type;
64 u8 indicator;
65 u16 reserved_2;
66} __attribute__ ((__packed__)) pci_data_struct_t;
67
68typedef struct {
69 u8 bus;
70 u8 devfn;
71#ifdef CONFIG_PCI_OPTION_ROM_RUN_YABEL
72 struct device* dev;
73#else
74 u64 puid;
75 phandle_t phandle;
76 ihandle_t ihandle;
77#endif
78
79
80 u64 vmem_addr;
81 u64 vmem_size;
82
83
84 u8 io_buffer[64 * 1024];
85 u16 pci_vendor_id;
86 u16 pci_device_id;
87
88 unsigned long img_addr;
89 u32 img_size;
90} biosemu_device_t;
91
92typedef struct {
93#ifdef CONFIG_PCI_OPTION_ROM_RUN_YABEL
94 unsigned long info;
95#else
96 u8 info;
97#endif
98 u8 bus;
99 u8 devfn;
100 u8 cfg_space_offset;
101 u64 address;
102 u64 address_offset;
103 u64 size;
104} __attribute__ ((__packed__)) translate_address_t;
105
106
107
108
109
110
111
112
113extern translate_address_t translate_address_array[11];
114
115
116
117extern u8 taa_last_entry;
118
119
120extern biosemu_device_t bios_device;
121
122u8 biosemu_dev_init(struct device * device);
123
124u8 biosemu_dev_check_exprom(unsigned long rom_base_addr);
125
126u8 biosemu_dev_translate_address(unsigned long * addr);
127
128
129
130
131static inline void
132out32le(void *addr, u32 val)
133{
134#ifdef __i386
135 *((u32*) addr) = cpu_to_le32(val);
136#else
137 asm volatile ("stwbrx %0, 0, %1"::"r" (val), "r"(addr));
138#endif
139}
140
141static inline u32
142in32le(void *addr)
143{
144 u32 val;
145#ifdef __i386
146 val = cpu_to_le32(*((u32 *) addr));
147#else
148 asm volatile ("lwbrx %0, 0, %1":"=r" (val):"r"(addr));
149#endif
150 return val;
151}
152
153static inline void
154out16le(void *addr, u16 val)
155{
156#ifdef __i386
157 *((u16*) addr) = cpu_to_le16(val);
158#else
159 asm volatile ("sthbrx %0, 0, %1"::"r" (val), "r"(addr));
160#endif
161}
162
163static inline u16
164in16le(void *addr)
165{
166 u16 val;
167#ifdef __i386
168 val = cpu_to_le16(*((u16*) addr));
169#else
170 asm volatile ("lhbrx %0, 0, %1":"=r" (val):"r"(addr));
171#endif
172 return val;
173}
174
175
176static inline void
177dumpHID(void)
178{
179 u64 hid;
180
181 __asm__ __volatile__("mfspr %0, 1009":"=r"(hid));
182 printf("HID1: %016llx\n", hid);
183
184 __asm__ __volatile__("mfspr %0, 1012":"=r"(hid));
185 printf("HID4: %016llx\n", hid);
186}
187
188#endif
189