Add qemu 2.4.0
[kvmfornfv.git] / qemu / roms / SLOF / clients / net-snk / app / biosemu / device.h
1 /******************************************************************************
2  * Copyright (c) 2004, 2008 IBM Corporation
3  * All rights reserved.
4  * This program and the accompanying materials
5  * are made available under the terms of the BSD License
6  * which accompanies this distribution, and is available at
7  * http://www.opensource.org/licenses/bsd-license.php
8  *
9  * Contributors:
10  *     IBM Corporation - initial implementation
11  *****************************************************************************/
12
13 #ifndef DEVICE_LIB_H
14 #define DEVICE_LIB_H
15
16 #include <stdint.h>
17 #include <cpu.h>
18 #include "of.h"
19 #include <stdio.h>
20
21 // a Expansion Header Struct as defined in Plug and Play BIOS Spec 1.0a Chapter 3.2
22 typedef struct {
23         char signature[4];      // signature
24         uint8_t structure_revision;
25         uint8_t length;         // in 16 byte blocks
26         uint16_t next_header_offset;    // offset to next Expansion Header as 16bit little-endian value, as offset from the start of the Expansion ROM
27         uint8_t reserved;
28         uint8_t checksum;       // the sum of all bytes of the Expansion Header must be 0
29         uint32_t device_id;     // PnP Device ID as 32bit little-endian value
30         uint16_t p_manufacturer_string; //16bit little-endian offset from start of Expansion ROM
31         uint16_t p_product_string;      //16bit little-endian offset from start of Expansion ROM
32         uint8_t device_base_type;
33         uint8_t device_sub_type;
34         uint8_t device_if_type;
35         uint8_t device_indicators;
36         // the following vectors are all 16bit little-endian offsets from start of Expansion ROM
37         uint16_t bcv;           // Boot Connection Vector
38         uint16_t dv;            // Disconnect Vector
39         uint16_t bev;           // Bootstrap Entry Vector
40         uint16_t reserved_2;
41         uint16_t sriv;          // Static Resource Information Vector
42 } __attribute__ ((__packed__)) exp_header_struct_t;
43
44 // a PCI Data Struct as defined in PCI 2.3 Spec Chapter 6.3.1.2
45 typedef struct {
46         uint8_t signature[4];   // signature, the String "PCIR"
47         uint16_t vendor_id;
48         uint16_t device_id;
49         uint16_t reserved;
50         uint16_t pci_ds_length; // PCI Data Structure Length, 16bit little-endian value
51         uint8_t pci_ds_revision;
52         uint8_t class_code[3];
53         uint16_t img_length;    // length of the Exp.ROM Image, 16bit little-endian value in 512 bytes
54         uint16_t img_revision;
55         uint8_t code_type;
56         uint8_t indicator;
57         uint16_t reserved_2;
58 } __attribute__ ((__packed__)) pci_data_struct_t;
59
60 typedef struct {
61         uint8_t bus;
62         uint8_t devfn;
63         uint64_t puid;
64         phandle_t phandle;
65         ihandle_t ihandle;
66         // store the address of the BAR that is used to simulate
67         // legacy VGA memory accesses
68         uint64_t vmem_addr;
69         uint64_t vmem_size;
70         // used to buffer I/O Accesses, that do not access the I/O Range of the device...
71         // 64k might be overkill, but we can buffer all I/O accesses...
72         uint8_t io_buffer[64 * 1024];
73         uint16_t pci_vendor_id;
74         uint16_t pci_device_id;
75         // translated address of the "PC-Compatible" Expansion ROM Image for this device
76         uint64_t img_addr;
77         uint32_t img_size;      // size of the Expansion ROM Image (read from the PCI Data Structure)
78 } device_t;
79
80 typedef struct {
81         uint8_t info;
82         uint8_t bus;
83         uint8_t devfn;
84         uint8_t cfg_space_offset;
85         uint64_t address;
86         uint64_t address_offset;
87         uint64_t size;
88 } __attribute__ ((__packed__)) translate_address_t;
89
90 // array to store address translations for this
91 // device. Needed for faster address translation, so
92 // not every I/O or Memory Access needs to call translate_address_dev
93 // and access the device tree
94 // 6 BARs, 1 Exp. ROM, 1 Cfg.Space, and 3 Legacy
95 // translations are supported... this should be enough for
96 // most devices... for VGA it is enough anyways...
97 translate_address_t translate_address_array[11];
98
99 // index of last translate_address_array entry
100 // set by get_dev_addr_info function
101 uint8_t taa_last_entry;
102
103 device_t bios_device;
104
105 uint8_t dev_init(char *device_name);
106 // NOTE: for dev_check_exprom to work, dev_init MUST be called first!
107 uint8_t dev_check_exprom(void);
108
109 uint8_t dev_translate_address(uint64_t * addr);
110
111 /* endianness swap functions for 16 and 32 bit words
112  * copied from axon_pciconfig.c
113  */
114 static inline void
115 out32le(void *addr, uint32_t val)
116 {
117         asm volatile ("stwbrx  %0, 0, %1"::"r" (val), "r"(addr));
118 }
119
120 static inline uint32_t
121 in32le(void *addr)
122 {
123         uint32_t val;
124         const uint32_t *zaddr = addr;
125         asm volatile ("lwbrx %0, %y1" : "=r"(val) : "Z"(*zaddr));
126         return val;
127 }
128
129 static inline void
130 out16le(void *addr, uint16_t val)
131 {
132         asm volatile ("sthbrx  %0, 0, %1"::"r" (val), "r"(addr));
133 }
134
135 static inline uint16_t
136 in16le(void *addr)
137 {
138         uint16_t val;
139         const uint16_t *zaddr = addr;
140         asm volatile ("lhbrx %0, %y1" : "=r"(val) : "Z"(*zaddr));
141         return val;
142 }
143
144 /* debug function, dumps HID1 and HID4 to detect wether caches are on/off */
145 static inline void
146 dumpHID(void)
147 {
148         uint64_t hid;
149         //HID1 = 1009
150         __asm__ __volatile__("mfspr %0, 1009":"=r"(hid));
151         printf("HID1: %016llx\n", hid);
152         //HID4 = 1012
153         __asm__ __volatile__("mfspr %0, 1012":"=r"(hid));
154         printf("HID4: %016llx\n", hid);
155 }
156
157 #endif