Changeset 137 for trunk/hal/x86_64/core
- Timestamp:
- Jul 4, 2017, 10:17:44 AM (7 years ago)
- Location:
- trunk/hal/x86_64/core
- Files:
-
- 4 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);
Note: See TracChangeset
for help on using the changeset viewer.