| [1] | 1 | /* | 
|---|
|  | 2 | * boot_info.h - informations passed by the bootloader to the kernel in each cluster. | 
|---|
|  | 3 | * | 
|---|
|  | 4 | * Author  Alain Greiner (june 2016) | 
|---|
|  | 5 | * | 
|---|
|  | 6 | * Copyright (c) UPMC Sorbonne Universites | 
|---|
|  | 7 | * | 
|---|
|  | 8 | * This file is part of ALMOS-MKH | 
|---|
|  | 9 | * | 
|---|
|  | 10 | * ALMOS-kernel is free software; you can redistribute it and/or modify it | 
|---|
|  | 11 | * under the terms of the GNU General Public License as published by | 
|---|
|  | 12 | * the Free Software Foundation; version 2.0 of the License. | 
|---|
|  | 13 | * | 
|---|
|  | 14 | * ALMOS-kernel is distributed in the hope that it will be useful, but | 
|---|
|  | 15 | * WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
|  | 16 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|---|
|  | 17 | * General Public License for more details. | 
|---|
|  | 18 | * | 
|---|
|  | 19 | * You should have received a copy of the GNU General Public License | 
|---|
|  | 20 | * along with ALMOS-kernel; if not, write to the Free Software Foundation, | 
|---|
|  | 21 | * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA | 
|---|
|  | 22 | */ | 
|---|
|  | 23 |  | 
|---|
|  | 24 | #ifndef _BOOT_INFO_H_ | 
|---|
|  | 25 | #define _BOOT_INFO_H_ | 
|---|
|  | 26 |  | 
|---|
|  | 27 | #include <hal_types.h> | 
|---|
|  | 28 | #include <almos_config.h> | 
|---|
|  | 29 |  | 
|---|
|  | 30 | /********************************************************************************************* | 
|---|
|  | 31 | * Boot-Info binary file signature | 
|---|
|  | 32 | ********************************************************************************************/ | 
|---|
|  | 33 |  | 
|---|
| [6] | 34 | #define BOOT_INFO_SIGNATURE    0x12344321 | 
|---|
| [1] | 35 |  | 
|---|
|  | 36 | /********************************************************************************************* | 
|---|
|  | 37 | * This structure defines the mapping between the hard-wired core identifier, | 
|---|
|  | 38 | * and the composite index (cluster_identifier , local index). | 
|---|
|  | 39 | ********************************************************************************************/ | 
|---|
|  | 40 |  | 
|---|
|  | 41 | typedef struct boot_core_s | 
|---|
|  | 42 | { | 
|---|
|  | 43 | gid_t    gid;                     /*! hardware identifier                               */ | 
|---|
|  | 44 | lid_t    lid;                     /*! local index in cluster                            */ | 
|---|
|  | 45 | cxy_t    cxy;                     /*! cluster identifier                                */ | 
|---|
|  | 46 | } | 
|---|
|  | 47 | boot_core_t; | 
|---|
|  | 48 |  | 
|---|
|  | 49 | /********************************************************************************************* | 
|---|
|  | 50 | * This structure defines the hardware connexion from one source device (identified by | 
|---|
|  | 51 | * the tuple (dev_type/channel/is_rx), to a PIC or XCU component (input IRQ index). | 
|---|
|  | 52 | ********************************************************************************************/ | 
|---|
|  | 53 |  | 
|---|
|  | 54 | typedef struct boot_irq_s | 
|---|
|  | 55 | { | 
|---|
|  | 56 | uint32_t    dev_type;             /*! source device functionnal type                    */ | 
|---|
|  | 57 | uint8_t     channel;              /*! source device channel index                       */ | 
|---|
|  | 58 | uint8_t     is_rx;                /*! source device direction                           */ | 
|---|
|  | 59 | uint8_t     valid;                /*! Boolean :input IRQ connected                      */ | 
|---|
|  | 60 | uint8_t     reserved;             /*! padding                                           */ | 
|---|
|  | 61 | } | 
|---|
|  | 62 | boot_irq_t; | 
|---|
|  | 63 |  | 
|---|
|  | 64 | /********************************************************************************************* | 
|---|
|  | 65 | * This structure defines all informations associated to a device in a given cluster. | 
|---|
|  | 66 | * There is one device descriptor per peripheral channel. | 
|---|
|  | 67 | ********************************************************************************************/ | 
|---|
|  | 68 |  | 
|---|
|  | 69 | typedef struct boot_device_s | 
|---|
|  | 70 | { | 
|---|
| [6] | 71 | uint64_t    base;                 /*! segment physical base address                     */ | 
|---|
|  | 72 | uint64_t    size;                 /*! channel size (bytes)                              */ | 
|---|
| [1] | 73 | uint32_t    type;                 /*! peripheral type (func | impl)                     */ | 
|---|
|  | 74 | uint32_t    channels;             /*! number of channels                                */ | 
|---|
|  | 75 | uint32_t    param0;               /*! semantic depends on peripherat type               */ | 
|---|
|  | 76 | uint32_t    param1;               /*! semantic depends on peripherat type               */ | 
|---|
|  | 77 | uint32_t    param2;               /*! semantic depends on peripherat type               */ | 
|---|
|  | 78 | uint32_t    param3;               /*! semantic depends on peripherat type               */ | 
|---|
|  | 79 | uint32_t    irqs;                 /*! number of input IRQs                              */ | 
|---|
|  | 80 | boot_irq_t  irq[32];              /*! array of input IRQS (PIC and ICU only)            */ | 
|---|
|  | 81 | } | 
|---|
|  | 82 | boot_device_t; | 
|---|
|  | 83 |  | 
|---|
|  | 84 | /********************************************************************************************* | 
|---|
|  | 85 | * This structure defines the interface between the boot-loader and the kernel. | 
|---|
|  | 86 | * In each cluster, the boot core build a local boot_info_t structure containing | 
|---|
|  | 87 | * both global (trans-clusters) informations, and cluster specific informations. | 
|---|
|  | 88 | ********************************************************************************************/ | 
|---|
|  | 89 |  | 
|---|
|  | 90 | typedef struct boot_info_s | 
|---|
|  | 91 | { | 
|---|
| [6] | 92 | uint32_t      signature;                     /*! boot info signature                    */ | 
|---|
| [1] | 93 |  | 
|---|
|  | 94 | // global platform parameters | 
|---|
|  | 95 |  | 
|---|
| [6] | 96 | uint32_t      paddr_width;                   /*! number of bits in physical address     */ | 
|---|
|  | 97 | uint32_t      x_width;                       /*! number of bits to code X coordinate    */ | 
|---|
|  | 98 | uint32_t      y_width;                       /*! number of bits to code Y coordinate    */ | 
|---|
|  | 99 | uint32_t      x_size;                        /*! number of cluster in a row             */ | 
|---|
|  | 100 | uint32_t      y_size;                        /*! number of cluster in a column          */ | 
|---|
|  | 101 | uint32_t      io_cxy;                        /*! IO cluster identifier                  */ | 
|---|
| [1] | 102 |  | 
|---|
| [6] | 103 | // shared resources | 
|---|
| [1] | 104 |  | 
|---|
| [6] | 105 | uint32_t      ext_dev_nr;                    /*! number of external peripherals         */ | 
|---|
|  | 106 | boot_device_t ext_dev[CONFIG_MAX_EXT_DEV];   /*! array of external peripherals          */ | 
|---|
| [1] | 107 |  | 
|---|
| [6] | 108 | // private resources (per cluster) | 
|---|
|  | 109 |  | 
|---|
|  | 110 | uint32_t      cxy;                           /*! cluster identifier                     */ | 
|---|
|  | 111 | uint32_t      cores_nr;                      /*! number of local cores in               */ | 
|---|
|  | 112 | boot_core_t   core[CONFIG_MAX_LOCAL_CORES];  /*! array of core descriptors              */ | 
|---|
|  | 113 | uint32_t      int_dev_nr;                    /*! number of local peripherals            */ | 
|---|
|  | 114 | boot_device_t int_dev[CONFIG_MAX_INT_DEV];   /*! array of internal peripherals          */ | 
|---|
|  | 115 | uint32_t      pages_nr;                      /*! number of 4 Kbytes pages               */ | 
|---|
|  | 116 | uint32_t      pages_offset;                  /*! number of pages allocated for kernel   */ | 
|---|
|  | 117 |  | 
|---|
| [1] | 118 | // kernel segments | 
|---|
|  | 119 |  | 
|---|
| [6] | 120 | intptr_t      kernel_code_start;             /*! kernel code base address               */ | 
|---|
|  | 121 | intptr_t      kernel_code_end;               /*! kernel code last address (excluded)    */ | 
|---|
|  | 122 | intptr_t      kernel_data_start;             /*! kernel data base address               */ | 
|---|
|  | 123 | intptr_t      kernel_data_end;               /*! kernel data last address (excluded)    */ | 
|---|
| [1] | 124 | } | 
|---|
|  | 125 | boot_info_t; | 
|---|
|  | 126 |  | 
|---|
|  | 127 | #endif  /* _BOOT_INFO_H_ */ | 
|---|