|
|
1.1 ! root 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(); ! 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: asm volatile ("lwbrx %0, 0, %1":"=r" (val):"r"(addr)); ! 125: return val; ! 126: } ! 127: ! 128: static inline void ! 129: out16le(void *addr, uint16_t val) ! 130: { ! 131: asm volatile ("sthbrx %0, 0, %1"::"r" (val), "r"(addr)); ! 132: } ! 133: ! 134: static inline uint16_t ! 135: in16le(void *addr) ! 136: { ! 137: uint16_t val; ! 138: asm volatile ("lhbrx %0, 0, %1":"=r" (val):"r"(addr)); ! 139: return val; ! 140: } ! 141: ! 142: /* debug function, dumps HID1 and HID4 to detect wether caches are on/off */ ! 143: static inline void ! 144: dumpHID() ! 145: { ! 146: uint64_t hid; ! 147: //HID1 = 1009 ! 148: __asm__ __volatile__("mfspr %0, 1009":"=r"(hid)); ! 149: printf("HID1: %016llx\n", hid); ! 150: //HID4 = 1012 ! 151: __asm__ __volatile__("mfspr %0, 1012":"=r"(hid)); ! 152: printf("HID4: %016llx\n", hid); ! 153: } ! 154: ! 155: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.