123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- /**************************************************************************
- Etherboot - BOOTP/TFTP Bootstrap Program
- UNDI NIC driver for Etherboot - header file
-
- This file Copyright (C) 2003 Michael Brown <mbrown@fensystems.co.uk>
- of Fen Systems Ltd. (http://www.fensystems.co.uk/). All rights
- reserved.
-
- $Id$
- ***************************************************************************/
-
- /*
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU General Public License as
- * published by the Free Software Foundation; either version 2, or (at
- * your option) any later version.
- */
-
- #include "pxe.h"
- #include "pic8259.h"
-
- /* A union that can function as the parameter block for any UNDI API call.
- */
- typedef t_PXENV_ANY pxenv_structure_t;
-
- /* BIOS PnP parameter block. We scan for this so that we can pass it
- * to the UNDI driver.
- */
-
- #define PNP_BIOS_SIGNATURE ( ('$'<<0) + ('P'<<8) + ('n'<<16) + ('P'<<24) )
- typedef struct pnp_bios {
- uint32_t signature;
- uint8_t version;
- uint8_t length;
- uint16_t control;
- uint8_t checksum;
- uint8_t dontcare[24];
- } PACKED pnp_bios_t;
-
- /* Structures within the PXE ROM.
- */
-
- #define ROM_SIGNATURE 0xaa55
- typedef struct rom {
- uint16_t signature;
- uint8_t unused[0x14];
- uint16_t undi_rom_id_off;
- uint16_t pcir_off;
- uint16_t pnp_off;
- } PACKED rom_t;
-
- #define PCIR_SIGNATURE ( ('P'<<0) + ('C'<<8) + ('I'<<16) + ('R'<<24) )
- typedef struct pcir_header {
- uint32_t signature;
- uint16_t vendor_id;
- uint16_t device_id;
- } PACKED pcir_header_t;
-
- #define PNP_SIGNATURE ( ('$'<<0) + ('P'<<8) + ('n'<<16) + ('P'<<24) )
- typedef struct pnp_header {
- uint32_t signature;
- uint8_t struct_revision;
- uint8_t length;
- uint16_t next;
- uint8_t reserved;
- uint8_t checksum;
- uint16_t id[2];
- uint16_t manuf_str_off;
- uint16_t product_str_off;
- uint8_t base_type;
- uint8_t sub_type;
- uint8_t interface_type;
- uint8_t indicator;
- uint16_t boot_connect_off;
- uint16_t disconnect_off;
- uint16_t initialise_off;
- uint16_t reserved2;
- uint16_t info;
- } PACKED pnp_header_t;
-
- #define UNDI_SIGNATURE ( ('U'<<0) + ('N'<<8) + ('D'<<16) + ('I'<<24) )
- typedef struct undi_rom_id {
- uint32_t signature;
- uint8_t struct_length;
- uint8_t struct_cksum;
- uint8_t struct_rev;
- uint8_t undi_rev[3];
- uint16_t undi_loader_off;
- uint16_t stack_size;
- uint16_t data_size;
- uint16_t code_size;
- } PACKED undi_rom_id_t;
-
- /* Nontrivial IRQ handler structure */
- typedef struct {
- segoff_t chain_to;
- uint8_t irq_chain, pad1, pad2, pad3;
- segoff_t entry;
- uint16_t count_all;
- uint16_t count_ours;
- t_PXENV_UNDI_ISR undi_isr;
- char code[0];
- } PACKED undi_irq_handler_t ;
-
- /* Storage buffers that we need in base memory. We collect these into
- * a single structure to make allocation simpler.
- */
-
- typedef struct undi_base_mem_xmit_data {
- MAC_ADDR destaddr;
- t_PXENV_UNDI_TBD tbd;
- } undi_base_mem_xmit_data_t;
-
- typedef struct undi_base_mem_data {
- pxenv_structure_t pxs;
- undi_base_mem_xmit_data_t xmit_data;
- char xmit_buffer[ETH_FRAME_LEN];
- /* Must be last in structure and paragraph-aligned */
- union {
- char e820mangler[0];
- char irq_handler[0];
- undi_irq_handler_t nontrivial_irq_handler;
- } __attribute__ ((aligned(16)));
- } undi_base_mem_data_t;
-
- /* Macros and data structures used when freeing bits of base memory
- * used by the UNDI driver.
- */
-
- #define FIRING_SQUAD_TARGET_SIZE 8
- #define FIRING_SQUAD_TARGET_INDEX(x) ( (x) / FIRING_SQUAD_TARGET_SIZE )
- #define FIRING_SQUAD_TARGET_BIT(x) ( (x) % FIRING_SQUAD_TARGET_SIZE )
- typedef struct firing_squad_lineup {
- uint8_t targets[ 640 / FIRING_SQUAD_TARGET_SIZE ];
- } firing_squad_lineup_t;
- typedef enum firing_squad_shoot {
- DONTSHOOT = 0,
- SHOOT = 1
- } firing_squad_shoot_t;
-
- /* Driver private data structure.
- */
-
- typedef struct undi {
- /* Pointers to various data structures */
- pnp_bios_t *pnp_bios;
- rom_t *rom;
- undi_rom_id_t *undi_rom_id;
- pxe_t *pxe;
- pxenv_structure_t *pxs;
- undi_base_mem_xmit_data_t *xmit_data;
- /* Pointers and sizes to keep track of allocated base memory */
- undi_base_mem_data_t *base_mem_data;
- void *driver_code;
- size_t driver_code_size;
- void *driver_data;
- size_t driver_data_size;
- char *xmit_buffer;
- /* Flags. We keep our own instead of trusting the UNDI driver
- * to have implemented PXENV_UNDI_GET_STATE correctly. Plus
- * there's the small issue of PXENV_UNDI_GET_STATE being the
- * same API call as PXENV_STOP_UNDI...
- */
- uint8_t prestarted; /* pxenv_start_undi() has been called */
- uint8_t started; /* pxenv_undi_startup() has been called */
- uint8_t initialized; /* pxenv_undi_initialize() has been called */
- uint8_t opened; /* pxenv_undi_open() has been called */
- /* Parameters that we need to store for future reference
- */
- struct pci_device pci;
- irq_t irq;
- } undi_t;
-
- /* Constants
- */
-
- #define HUNT_FOR_PIXIES 0
- #define HUNT_FOR_UNDI_ROMS 1
|