| 1 | /* | 
|---|
| 2 |  * boot_info.h - informations passed by the bootloader to the kernel in each cluster. | 
|---|
| 3 |  * | 
|---|
| 4 |  * Author  Alain Greiner (june 2016,2017) | 
|---|
| 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_kernel_types.h> | 
|---|
| 28 | #include <kernel_config.h> | 
|---|
| 29 |  | 
|---|
| 30 | /********************************************************************************************* | 
|---|
| 31 |  * Boot-Info binary file signature | 
|---|
| 32 |  ********************************************************************************************/ | 
|---|
| 33 |  | 
|---|
| 34 | #define BOOT_INFO_SIGNATURE    0x12344321 | 
|---|
| 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 functional 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 |  * The base address can be physical or virtual depending on the hardware architecture. | 
|---|
| 68 |  ********************************************************************************************/ | 
|---|
| 69 |  | 
|---|
| 70 | typedef struct boot_device_s | 
|---|
| 71 | { | 
|---|
| 72 |     uint64_t    base;                 /*! segment base address                              */ | 
|---|
| 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 (PIC only)                   */ | 
|---|
| 80 |     boot_irq_t  irq[32];              /*! array of input IRQS (PIC only)                    */ | 
|---|
| 81 | } | 
|---|
| 82 | boot_device_t; | 
|---|
| 83 |  | 
|---|
| 84 | /********************************************************************************************* | 
|---|
| 85 |  * This structure defines a reserved zone in the physical address space of a given cluster. | 
|---|
| 86 |  * A reserved zone is described as a set of contiguous small pages (4 Kbytes) covering the | 
|---|
| 87 |  * reserved zone, that must be considered already allocated. | 
|---|
| 88 |  ********************************************************************************************/ | 
|---|
| 89 |  | 
|---|
| 90 | typedef struct boot_rsvd_s | 
|---|
| 91 | { | 
|---|
| 92 |     ppn_t      first_page;            /*! first physical page index in cluster              */  | 
|---|
| 93 |     uint32_t   npages;                /*! number of small pages                             */ | 
|---|
| 94 | } | 
|---|
| 95 | boot_rsvd_t; | 
|---|
| 96 |  | 
|---|
| 97 | /********************************************************************************************* | 
|---|
| 98 |  * This structure defines the interface between the boot-loader and the kernel. | 
|---|
| 99 |  * In each cluster, the boot core build a local boot_info_t structure containing | 
|---|
| 100 |  * both global (trans-clusters) informations, and cluster specific informations. | 
|---|
| 101 |  ********************************************************************************************/ | 
|---|
| 102 |  | 
|---|
| 103 | typedef struct boot_info_s | 
|---|
| 104 | { | 
|---|
| 105 |     uint32_t      signature;                     /*! boot info signature                    */ | 
|---|
| 106 |  | 
|---|
| 107 |     // global platform parameters | 
|---|
| 108 |  | 
|---|
| 109 |         uint32_t      paddr_width;                   /*! number of bits in physical address     */ | 
|---|
| 110 |     uint32_t      x_width;                       /*! number of bits to code X coordinate    */ | 
|---|
| 111 |     uint32_t      y_width;                       /*! number of bits to code Y coordinate    */ | 
|---|
| 112 |         uint32_t      x_size;                        /*! number of cluster in a row             */ | 
|---|
| 113 |         uint32_t      y_size;                        /*! number of cluster in a column          */ | 
|---|
| 114 |     uint32_t      x_max;                         /*! [FIXME] Nb of non-empty cluster in row */ | 
|---|
| 115 |     uint32_t      y_max;                         /*! [FIXME] Nb of non_empty cluster in col */ | 
|---|
| 116 |     uint32_t      cluster_info[CONFIG_MAX_CLUSTERS_X][CONFIG_MAX_CLUSTERS_Y]; | 
|---|
| 117 |                                                  /*! An array of infos about all clusters   */ | 
|---|
| 118 |         uint32_t      io_cxy;                        /*! IO cluster identifier                  */ | 
|---|
| 119 |  | 
|---|
| 120 |     // shared resources | 
|---|
| 121 |  | 
|---|
| 122 |     uint32_t      ext_dev_nr;                    /*! number of external peripherals         */ | 
|---|
| 123 |     boot_device_t ext_dev[CONFIG_MAX_EXT_DEV];   /*! array of external peripherals          */ | 
|---|
| 124 |  | 
|---|
| 125 |     // private resources (per cluster) | 
|---|
| 126 |  | 
|---|
| 127 |         uint32_t      cxy;                           /*! cluster identifier                     */ | 
|---|
| 128 |         uint32_t      cores_nr;                      /*! number of local cores in               */ | 
|---|
| 129 |     boot_core_t   core[CONFIG_MAX_LOCAL_CORES];  /*! array of core descriptors              */   | 
|---|
| 130 |     uint32_t      rsvd_nr;                       /*! number of reserved zones               */ | 
|---|
| 131 |     boot_rsvd_t   rsvd[CONFIG_PPM_MAX_RSVD];     /*! array of reserved zones                */ | 
|---|
| 132 |  | 
|---|
| 133 |     uint32_t      int_dev_nr;                    /*! number of internal peripherals         */ | 
|---|
| 134 |     boot_device_t int_dev[CONFIG_MAX_INT_DEV];   /*! array of internal peripherals          */ | 
|---|
| 135 |  | 
|---|
| 136 |     uint32_t      pages_offset;                  /*! first free page index (after kernel)   */ | 
|---|
| 137 |     uint32_t      pages_nr;                      /*! total number of physical pages in RAM  */ | 
|---|
| 138 |  | 
|---|
| 139 |     // kernel segments | 
|---|
| 140 |  | 
|---|
| 141 |     intptr_t      kcode_base;                    /*! kernel code base paddr                 */ | 
|---|
| 142 |     intptr_t      kcode_size;                    /*! kernel code size                       */ | 
|---|
| 143 |     intptr_t      kdata_base;                    /*! kernel data base paddr                 */ | 
|---|
| 144 |     intptr_t      kdata_size;                    /*! kernel data size                       */ | 
|---|
| 145 |     intptr_t      kentry_base;                   /*! kernel entry base paddr                */ | 
|---|
| 146 |     intptr_t      kentry_size;                   /*! kernel entry size                      */ | 
|---|
| 147 | } | 
|---|
| 148 | boot_info_t; | 
|---|
| 149 |  | 
|---|
| 150 | #endif  /* _BOOT_INFO_H_ */ | 
|---|