- Timestamp:
- Jul 4, 2017, 10:17:44 AM (7 years ago)
- Location:
- trunk/hal/x86_64
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/hal/x86_64/core/hal_apic.c
r135 r137 132 132 #define IOAPICVER 0x01 133 133 #define IOAPICARB 0x02 134 134 135 #define IOREDTBL 0x10 136 # define IOREDTBL_DEL_FIXED 0x000 137 # define IOREDTBL_DEL_LOPRI 0x100 138 # define IOREDTBL_DEL_SMI 0x200 139 # define IOREDTBL_DEL_NMI 0x400 140 # define IOREDTBL_DEL_INIT 0x500 141 # define IOREDTBL_DEL_EXTINT 0x700 142 # define IOREDTBL_DEM_PHYS 0x000 143 # define IOREDTBL_DEM_LOGIC 0x800 144 # define IOREDTBL_DES_SHIFT 56 145 # define IOREDTBL_MSK 0x10000 135 146 136 147 void hal_ioapic_write(uint8_t reg, uint32_t val) … … 146 157 } 147 158 148 void hal_ioapic_set_entry(uint8_t index, uint64_t data) 149 { 159 void hal_ioapic_disable_entry(uint8_t index) 160 { 161 const uint64_t data = IOREDTBL_MSK; 162 150 163 hal_ioapic_write(IOREDTBL + index * 2, (uint32_t)(data & 0xFFFFFFFF)); 151 164 hal_ioapic_write(IOREDTBL + index * 2 + 1, (uint32_t)(data >> 32)); 152 165 } 153 166 167 void hal_ioapic_set_entry(uint8_t index, uint8_t vec, uint8_t dest) 168 { 169 const uint64_t data = ((uint64_t)dest << IOREDTBL_DES_SHIFT) | 170 IOREDTBL_DEM_PHYS | IOREDTBL_DEL_FIXED | vec; 171 172 hal_ioapic_write(IOREDTBL + index * 2, (uint32_t)(data & 0xFFFFFFFF)); 173 hal_ioapic_write(IOREDTBL + index * 2 + 1, (uint32_t)(data >> 32)); 174 } 175 154 176 static void hal_ioapic_init() 155 177 { … … 166 188 /* Explicitly disable (mask) each vector */ 167 189 for (i = 0; i < ioapic_pins; i++) { 168 hal_ioapic_ set_entry(i, IOENTRY_DISABLE);190 hal_ioapic_disable_entry(i); 169 191 } 170 192 … … 172 194 173 195 /* Now, enable the keyboard */ 174 hal_ioapic_set_entry(IRQ_KEYBOARD, IOAPIC_KEYBOARD_VECTOR );196 hal_ioapic_set_entry(IRQ_KEYBOARD, IOAPIC_KEYBOARD_VECTOR, 0); 175 197 } 176 198 -
trunk/hal/x86_64/core/hal_apic.h
r135 r137 21 21 22 22 #ifndef x86_ASM 23 void hal_ioapic_set_entry(uint8_t index, uint64_t data); 23 void hal_ioapic_disable_entry(uint8_t index); 24 void hal_ioapic_set_entry(uint8_t index, uint8_t vec, uint8_t dest); 24 25 25 26 uint32_t hal_lapic_gid(); … … 33 34 */ 34 35 35 #define IOENTRY_DISABLE 0x10000 36 36 37 37 38 -
trunk/hal/x86_64/core/hal_drivers.c
r136 r137 43 43 uint32_t irq_type, lid_t lid) 44 44 { 45 soclib_xcu_disable_irq(icu, 1 <<irq_index, irq_type, lid);45 soclib_xcu_disable_irq(icu, irq_index, irq_type, lid); 46 46 } 47 47 … … 49 49 uint32_t irq_type, lid_t lid) 50 50 { 51 soclib_xcu_enable_irq(icu, 1 <<irq_index, irq_type, lid);51 soclib_xcu_enable_irq(icu, irq_index, irq_type, lid); 52 52 } 53 53 -
trunk/hal/x86_64/core/hal_init.c
r135 r137 84 84 static void init_bootinfo_icu(boot_device_t *dev) 85 85 { 86 extern uint32_t hwi_baseidx; 87 extern uint32_t wti_baseidx; 88 extern uint32_t pti_baseidx; 89 extern size_t ioapic_pins; 90 86 91 memset(dev, 0, sizeof(boot_device_t)); 87 92 88 dev->base = NULL; /* XXX */93 dev->base = 0; 89 94 dev->type = (DEV_FUNC_ICU << 16) | IMPL_ICU_XCU; 90 95 dev->channels = 1; 91 dev->param0 = 0; 92 dev->param1 = 0; 93 dev->param2 = 0; 96 97 /* 98 * Give 20% of the pins to HWI, 80% to WTI. 99 */ 100 dev->param0 = (ioapic_pins * 20) / 100; /* hwi_nr */ 101 dev->param1 = ioapic_pins - dev->param0; /* wti_nr */ 102 103 /* 104 * We always set 1 for pti_nr. On x86, timer interrupts are handled by 105 * LAPIC, which is per-cpu and not global. Therefore, we always have one 106 * timer for each CPU, and its IRQ number is faked to 0. 107 */ 108 dev->param2 = 1; /* pti_nr */ 109 94 110 dev->param3 = 0; 111 112 /* Set the base idx for the XCU driver */ 113 hwi_baseidx = 0; 114 wti_baseidx = dev->param0; 115 pti_baseidx = 0xFFFFFFFF; 95 116 96 117 #ifdef NOTYET … … 132 153 size_t i, rsvd_nr; 133 154 134 memset(rsvd, 0, sizeof(boot_rsvd_t) );155 memset(rsvd, 0, sizeof(boot_rsvd_t) * CONFIG_PPM_MAX_RSVD); 135 156 136 157 i = 0, rsvd_nr = 0; … … 208 229 init_bootinfo_core(&info->core[0]); 209 230 210 info->rsvd_nr = init_bootinfo_rsvd( &info->rsvd);231 info->rsvd_nr = init_bootinfo_rsvd((boot_rsvd_t *)&info->rsvd); 211 232 212 233 init_bootinfo_icu(&info->dev_icu); -
trunk/hal/x86_64/drivers/soclib_xcu.c
r135 r137 32 32 extern size_t ioapic_pins; 33 33 34 uint64_t apic_fake_status __in_kdata = 0; 35 36 /* 37 * These indexes are used to translate a type::idx to a pin on the IOAPIC. 38 */ 39 uint32_t hwi_baseidx __in_kdata = 0; 40 uint32_t wti_baseidx __in_kdata = 0; 41 uint32_t pti_baseidx __in_kdata = 0; 42 34 43 void soclib_xcu_init(chdev_t *icu, lid_t lid) 35 44 { … … 38 47 /* disable all IRQs */ 39 48 for (i = 0; i < ioapic_pins; i++) { 40 hal_ioapic_ set_entry(i, IOENTRY_DISABLE);49 hal_ioapic_disable_entry(i); 41 50 } 42 51 … … 44 53 } 45 54 46 void soclib_xcu_disable_irq( chdev_t * icu, 47 uint32_t mask, 48 uint32_t type, 49 lid_t lid ) 55 void soclib_xcu_enable_irq(chdev_t *icu, uint32_t idx, uint32_t type, 56 lid_t lid) 50 57 { 58 uint32_t pin; 59 60 switch (type) { 61 case HWI_TYPE: 62 pin = hwi_baseidx + idx; 63 case WTI_TYPE: 64 pin = wti_baseidx + idx; 65 case PTI_TYPE: 66 pin = pti_baseidx + idx; 67 default: 68 x86_panic("enabling wrong irq"); 69 } 70 51 71 x86_panic((char *)__func__); 52 72 } 53 73 54 void soclib_xcu_enable_irq( chdev_t * icu, 55 uint32_t mask, 56 uint32_t type, 57 lid_t lid ) 74 void soclib_xcu_disable_irq(chdev_t *icu, uint32_t idx, uint32_t type, 75 lid_t lid) 58 76 { 59 77 x86_panic((char *)__func__); … … 83 101 } 84 102 85 void soclib_xcu_get_status( chdev_t * icu, 86 lid_t lid, 87 uint32_t * hwi_status, 88 uint32_t * wti_status, 89 uint32_t * pti_status ) 103 104 105 106 107 void soclib_xcu_get_status(chdev_t *icu, lid_t lid, uint32_t *hwi_status, 108 uint32_t *wti_status, uint32_t *pti_status) 90 109 { 110 if (lid != 0) { 111 x86_panic("xcu_get_status should have lid==0"); 112 } 113 91 114 x86_panic((char *)__func__); 92 115 } 116 117 118 119 120 93 121 94 122 void soclib_xcu_send_ipi( xptr_t icu_xp,
Note: See TracChangeset
for help on using the changeset viewer.