| 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 |  | 
|---|
| 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 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 | { | 
|---|
| 71 | uint64_t    base;                 /*! segment physical base address                     */ | 
|---|
| 72 | uint64_t    size;                 /*! channel size (bytes)                              */ | 
|---|
| 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 | { | 
|---|
| 92 | uint32_t      signature;                     /*! boot info signature                    */ | 
|---|
| 93 |  | 
|---|
| 94 | // global platform parameters | 
|---|
| 95 |  | 
|---|
| 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                  */ | 
|---|
| 102 |  | 
|---|
| 103 | // shared resources | 
|---|
| 104 |  | 
|---|
| 105 | uint32_t      ext_dev_nr;                    /*! number of external peripherals         */ | 
|---|
| 106 | boot_device_t ext_dev[CONFIG_MAX_EXT_DEV];   /*! array of external peripherals          */ | 
|---|
| 107 |  | 
|---|
| 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 |  | 
|---|
| 118 | // kernel segments | 
|---|
| 119 |  | 
|---|
| 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)    */ | 
|---|
| 124 | } | 
|---|
| 125 | boot_info_t; | 
|---|
| 126 |  | 
|---|
| 127 | #endif  /* _BOOT_INFO_H_ */ | 
|---|