1 #include <sys/param.h> 2 3 #include <machine/intr_machdep.h> 4 #include <machine/msi_machdep.h> 5 #include <machine/msi_var.h> 6 #include <machine/md_var.h> 7 8 #include <machine_base/apic/apicreg.h> 9 #include <machine_base/apic/lapic.h> 10 11 /* MSI address */ 12 #define MSI_X86_ADDR_DEST 0x000ff000 13 #define MSI_X86_ADDR_RH 0x00000008 14 # define MSI_X86_ADDR_RH_ON 0x00000008 15 # define MSI_X86_ADDR_RH_OFF 0x00000000 16 #define MSI_X86_ADDR_DM 0x00000004 17 # define MSI_X86_ADDR_DM_PHYSICAL 0x00000000 18 # define MSI_X86_ADDR_DM_LOGICAL 0x00000004 19 20 /* MSI data */ 21 #define MSI_X86_DATA_TRGRMOD IOART_TRGRMOD /* Trigger mode. */ 22 # define MSI_X86_DATA_TRGREDG IOART_TRGREDG 23 # define MSI_X86_DATA_TRGRLVL IOART_TRGRLVL 24 #define MSI_X86_DATA_LEVEL 0x00004000 /* Polarity. */ 25 # define MSI_X86_DATA_DEASSERT 0x00000000 26 # define MSI_X86_DATA_ASSERT 0x00004000 27 #define MSI_X86_DATA_DELMOD IOART_DELMOD /* Delivery mode. */ 28 # define MSI_X86_DATA_DELFIXED IOART_DELFIXED 29 # define MSI_X86_DATA_DELLOPRI IOART_DELLOPRI 30 # define MSI_X86_DATA_DELSMI IOART_DELSMI 31 # define MSI_X86_DATA_DELNMI IOART_DELNMI 32 # define MSI_X86_DATA_DELINIT IOART_DELINIT 33 # define MSI_X86_DATA_DELEXINT IOART_DELEXINT 34 #define MSI_X86_DATA_INTVEC IOART_INTVEC /* Interrupt vector. */ 35 36 #define MSI_X86_ADDR(lapic_id) \ 37 (MSI_X86_ADDR_BASE | (lapic_id) << 12 | \ 38 MSI_X86_ADDR_RH_OFF | MSI_X86_ADDR_DM_PHYSICAL) 39 #define MSI_X86_DATA(vector) \ 40 (MSI_X86_DATA_TRGREDG | MSI_X86_DATA_DELFIXED | (vector)) 41 42 extern inthand_t 43 IDTVEC(msi_intr0), 44 IDTVEC(msi_intr1), 45 IDTVEC(msi_intr2), 46 IDTVEC(msi_intr3), 47 IDTVEC(msi_intr4), 48 IDTVEC(msi_intr5), 49 IDTVEC(msi_intr6), 50 IDTVEC(msi_intr7), 51 IDTVEC(msi_intr8), 52 IDTVEC(msi_intr9), 53 IDTVEC(msi_intr10), 54 IDTVEC(msi_intr11), 55 IDTVEC(msi_intr12), 56 IDTVEC(msi_intr13), 57 IDTVEC(msi_intr14), 58 IDTVEC(msi_intr15), 59 IDTVEC(msi_intr16), 60 IDTVEC(msi_intr17), 61 IDTVEC(msi_intr18), 62 IDTVEC(msi_intr19), 63 IDTVEC(msi_intr20), 64 IDTVEC(msi_intr21), 65 IDTVEC(msi_intr22), 66 IDTVEC(msi_intr23), 67 IDTVEC(msi_intr24), 68 IDTVEC(msi_intr25), 69 IDTVEC(msi_intr26), 70 IDTVEC(msi_intr27), 71 IDTVEC(msi_intr28), 72 IDTVEC(msi_intr29), 73 IDTVEC(msi_intr30), 74 IDTVEC(msi_intr31), 75 IDTVEC(msi_intr32), 76 IDTVEC(msi_intr33), 77 IDTVEC(msi_intr34), 78 IDTVEC(msi_intr35), 79 IDTVEC(msi_intr36), 80 IDTVEC(msi_intr37), 81 IDTVEC(msi_intr38), 82 IDTVEC(msi_intr39), 83 IDTVEC(msi_intr40), 84 IDTVEC(msi_intr41), 85 IDTVEC(msi_intr42), 86 IDTVEC(msi_intr43), 87 IDTVEC(msi_intr44), 88 IDTVEC(msi_intr45), 89 IDTVEC(msi_intr46), 90 IDTVEC(msi_intr47), 91 IDTVEC(msi_intr48), 92 IDTVEC(msi_intr49), 93 IDTVEC(msi_intr50), 94 IDTVEC(msi_intr51), 95 IDTVEC(msi_intr52), 96 IDTVEC(msi_intr53), 97 IDTVEC(msi_intr54), 98 IDTVEC(msi_intr55), 99 IDTVEC(msi_intr56), 100 IDTVEC(msi_intr57), 101 IDTVEC(msi_intr58), 102 IDTVEC(msi_intr59), 103 IDTVEC(msi_intr60), 104 IDTVEC(msi_intr61), 105 IDTVEC(msi_intr62), 106 IDTVEC(msi_intr63), 107 IDTVEC(msi_intr64), 108 IDTVEC(msi_intr65), 109 IDTVEC(msi_intr66), 110 IDTVEC(msi_intr67), 111 IDTVEC(msi_intr68), 112 IDTVEC(msi_intr69), 113 IDTVEC(msi_intr70), 114 IDTVEC(msi_intr71), 115 IDTVEC(msi_intr72), 116 IDTVEC(msi_intr73), 117 IDTVEC(msi_intr74), 118 IDTVEC(msi_intr75), 119 IDTVEC(msi_intr76), 120 IDTVEC(msi_intr77), 121 IDTVEC(msi_intr78), 122 IDTVEC(msi_intr79), 123 IDTVEC(msi_intr80), 124 IDTVEC(msi_intr81), 125 IDTVEC(msi_intr82), 126 IDTVEC(msi_intr83), 127 IDTVEC(msi_intr84), 128 IDTVEC(msi_intr85), 129 IDTVEC(msi_intr86), 130 IDTVEC(msi_intr87), 131 IDTVEC(msi_intr88), 132 IDTVEC(msi_intr89), 133 IDTVEC(msi_intr90), 134 IDTVEC(msi_intr91), 135 IDTVEC(msi_intr92), 136 IDTVEC(msi_intr93), 137 IDTVEC(msi_intr94), 138 IDTVEC(msi_intr95), 139 IDTVEC(msi_intr96), 140 IDTVEC(msi_intr97), 141 IDTVEC(msi_intr98), 142 IDTVEC(msi_intr99), 143 IDTVEC(msi_intr100), 144 IDTVEC(msi_intr101), 145 IDTVEC(msi_intr102), 146 IDTVEC(msi_intr103), 147 IDTVEC(msi_intr104), 148 IDTVEC(msi_intr105), 149 IDTVEC(msi_intr106), 150 IDTVEC(msi_intr107), 151 IDTVEC(msi_intr108), 152 IDTVEC(msi_intr109), 153 IDTVEC(msi_intr110), 154 IDTVEC(msi_intr111), 155 IDTVEC(msi_intr112), 156 IDTVEC(msi_intr113), 157 IDTVEC(msi_intr114), 158 IDTVEC(msi_intr115), 159 IDTVEC(msi_intr116), 160 IDTVEC(msi_intr117), 161 IDTVEC(msi_intr118), 162 IDTVEC(msi_intr119), 163 IDTVEC(msi_intr120), 164 IDTVEC(msi_intr121), 165 IDTVEC(msi_intr122), 166 IDTVEC(msi_intr123), 167 IDTVEC(msi_intr124), 168 IDTVEC(msi_intr125), 169 IDTVEC(msi_intr126), 170 IDTVEC(msi_intr127), 171 IDTVEC(msi_intr128), 172 IDTVEC(msi_intr129), 173 IDTVEC(msi_intr130), 174 IDTVEC(msi_intr131), 175 IDTVEC(msi_intr132), 176 IDTVEC(msi_intr133), 177 IDTVEC(msi_intr134), 178 IDTVEC(msi_intr135), 179 IDTVEC(msi_intr136), 180 IDTVEC(msi_intr137), 181 IDTVEC(msi_intr138), 182 IDTVEC(msi_intr139), 183 IDTVEC(msi_intr140), 184 IDTVEC(msi_intr141), 185 IDTVEC(msi_intr142), 186 IDTVEC(msi_intr143), 187 IDTVEC(msi_intr144), 188 IDTVEC(msi_intr145), 189 IDTVEC(msi_intr146), 190 IDTVEC(msi_intr147), 191 IDTVEC(msi_intr148), 192 IDTVEC(msi_intr149), 193 IDTVEC(msi_intr150), 194 IDTVEC(msi_intr151), 195 IDTVEC(msi_intr152), 196 IDTVEC(msi_intr153), 197 IDTVEC(msi_intr154), 198 IDTVEC(msi_intr155), 199 IDTVEC(msi_intr156), 200 IDTVEC(msi_intr157), 201 IDTVEC(msi_intr158), 202 IDTVEC(msi_intr159), 203 IDTVEC(msi_intr160), 204 IDTVEC(msi_intr161), 205 IDTVEC(msi_intr162), 206 IDTVEC(msi_intr163), 207 IDTVEC(msi_intr164), 208 IDTVEC(msi_intr165), 209 IDTVEC(msi_intr166), 210 IDTVEC(msi_intr167), 211 IDTVEC(msi_intr168), 212 IDTVEC(msi_intr169), 213 IDTVEC(msi_intr170), 214 IDTVEC(msi_intr171), 215 IDTVEC(msi_intr172), 216 IDTVEC(msi_intr173), 217 IDTVEC(msi_intr174), 218 IDTVEC(msi_intr175), 219 IDTVEC(msi_intr176), 220 IDTVEC(msi_intr177), 221 IDTVEC(msi_intr178), 222 IDTVEC(msi_intr179), 223 IDTVEC(msi_intr180), 224 IDTVEC(msi_intr181), 225 IDTVEC(msi_intr182), 226 IDTVEC(msi_intr183), 227 IDTVEC(msi_intr184), 228 IDTVEC(msi_intr185), 229 IDTVEC(msi_intr186), 230 IDTVEC(msi_intr187), 231 IDTVEC(msi_intr188), 232 IDTVEC(msi_intr189), 233 IDTVEC(msi_intr190), 234 IDTVEC(msi_intr191); 235 236 static inthand_t *msi_intr[IDT_HWI_VECTORS] = { 237 &IDTVEC(msi_intr0), 238 &IDTVEC(msi_intr1), 239 &IDTVEC(msi_intr2), 240 &IDTVEC(msi_intr3), 241 &IDTVEC(msi_intr4), 242 &IDTVEC(msi_intr5), 243 &IDTVEC(msi_intr6), 244 &IDTVEC(msi_intr7), 245 &IDTVEC(msi_intr8), 246 &IDTVEC(msi_intr9), 247 &IDTVEC(msi_intr10), 248 &IDTVEC(msi_intr11), 249 &IDTVEC(msi_intr12), 250 &IDTVEC(msi_intr13), 251 &IDTVEC(msi_intr14), 252 &IDTVEC(msi_intr15), 253 &IDTVEC(msi_intr16), 254 &IDTVEC(msi_intr17), 255 &IDTVEC(msi_intr18), 256 &IDTVEC(msi_intr19), 257 &IDTVEC(msi_intr20), 258 &IDTVEC(msi_intr21), 259 &IDTVEC(msi_intr22), 260 &IDTVEC(msi_intr23), 261 &IDTVEC(msi_intr24), 262 &IDTVEC(msi_intr25), 263 &IDTVEC(msi_intr26), 264 &IDTVEC(msi_intr27), 265 &IDTVEC(msi_intr28), 266 &IDTVEC(msi_intr29), 267 &IDTVEC(msi_intr30), 268 &IDTVEC(msi_intr31), 269 &IDTVEC(msi_intr32), 270 &IDTVEC(msi_intr33), 271 &IDTVEC(msi_intr34), 272 &IDTVEC(msi_intr35), 273 &IDTVEC(msi_intr36), 274 &IDTVEC(msi_intr37), 275 &IDTVEC(msi_intr38), 276 &IDTVEC(msi_intr39), 277 &IDTVEC(msi_intr40), 278 &IDTVEC(msi_intr41), 279 &IDTVEC(msi_intr42), 280 &IDTVEC(msi_intr43), 281 &IDTVEC(msi_intr44), 282 &IDTVEC(msi_intr45), 283 &IDTVEC(msi_intr46), 284 &IDTVEC(msi_intr47), 285 &IDTVEC(msi_intr48), 286 &IDTVEC(msi_intr49), 287 &IDTVEC(msi_intr50), 288 &IDTVEC(msi_intr51), 289 &IDTVEC(msi_intr52), 290 &IDTVEC(msi_intr53), 291 &IDTVEC(msi_intr54), 292 &IDTVEC(msi_intr55), 293 &IDTVEC(msi_intr56), 294 &IDTVEC(msi_intr57), 295 &IDTVEC(msi_intr58), 296 &IDTVEC(msi_intr59), 297 &IDTVEC(msi_intr60), 298 &IDTVEC(msi_intr61), 299 &IDTVEC(msi_intr62), 300 &IDTVEC(msi_intr63), 301 &IDTVEC(msi_intr64), 302 &IDTVEC(msi_intr65), 303 &IDTVEC(msi_intr66), 304 &IDTVEC(msi_intr67), 305 &IDTVEC(msi_intr68), 306 &IDTVEC(msi_intr69), 307 &IDTVEC(msi_intr70), 308 &IDTVEC(msi_intr71), 309 &IDTVEC(msi_intr72), 310 &IDTVEC(msi_intr73), 311 &IDTVEC(msi_intr74), 312 &IDTVEC(msi_intr75), 313 &IDTVEC(msi_intr76), 314 &IDTVEC(msi_intr77), 315 &IDTVEC(msi_intr78), 316 &IDTVEC(msi_intr79), 317 &IDTVEC(msi_intr80), 318 &IDTVEC(msi_intr81), 319 &IDTVEC(msi_intr82), 320 &IDTVEC(msi_intr83), 321 &IDTVEC(msi_intr84), 322 &IDTVEC(msi_intr85), 323 &IDTVEC(msi_intr86), 324 &IDTVEC(msi_intr87), 325 &IDTVEC(msi_intr88), 326 &IDTVEC(msi_intr89), 327 &IDTVEC(msi_intr90), 328 &IDTVEC(msi_intr91), 329 &IDTVEC(msi_intr92), 330 &IDTVEC(msi_intr93), 331 &IDTVEC(msi_intr94), 332 &IDTVEC(msi_intr95), 333 &IDTVEC(msi_intr96), 334 &IDTVEC(msi_intr97), 335 &IDTVEC(msi_intr98), 336 &IDTVEC(msi_intr99), 337 &IDTVEC(msi_intr100), 338 &IDTVEC(msi_intr101), 339 &IDTVEC(msi_intr102), 340 &IDTVEC(msi_intr103), 341 &IDTVEC(msi_intr104), 342 &IDTVEC(msi_intr105), 343 &IDTVEC(msi_intr106), 344 &IDTVEC(msi_intr107), 345 &IDTVEC(msi_intr108), 346 &IDTVEC(msi_intr109), 347 &IDTVEC(msi_intr110), 348 &IDTVEC(msi_intr111), 349 &IDTVEC(msi_intr112), 350 &IDTVEC(msi_intr113), 351 &IDTVEC(msi_intr114), 352 &IDTVEC(msi_intr115), 353 &IDTVEC(msi_intr116), 354 &IDTVEC(msi_intr117), 355 &IDTVEC(msi_intr118), 356 &IDTVEC(msi_intr119), 357 &IDTVEC(msi_intr120), 358 &IDTVEC(msi_intr121), 359 &IDTVEC(msi_intr122), 360 &IDTVEC(msi_intr123), 361 &IDTVEC(msi_intr124), 362 &IDTVEC(msi_intr125), 363 &IDTVEC(msi_intr126), 364 &IDTVEC(msi_intr127), 365 &IDTVEC(msi_intr128), 366 &IDTVEC(msi_intr129), 367 &IDTVEC(msi_intr130), 368 &IDTVEC(msi_intr131), 369 &IDTVEC(msi_intr132), 370 &IDTVEC(msi_intr133), 371 &IDTVEC(msi_intr134), 372 &IDTVEC(msi_intr135), 373 &IDTVEC(msi_intr136), 374 &IDTVEC(msi_intr137), 375 &IDTVEC(msi_intr138), 376 &IDTVEC(msi_intr139), 377 &IDTVEC(msi_intr140), 378 &IDTVEC(msi_intr141), 379 &IDTVEC(msi_intr142), 380 &IDTVEC(msi_intr143), 381 &IDTVEC(msi_intr144), 382 &IDTVEC(msi_intr145), 383 &IDTVEC(msi_intr146), 384 &IDTVEC(msi_intr147), 385 &IDTVEC(msi_intr148), 386 &IDTVEC(msi_intr149), 387 &IDTVEC(msi_intr150), 388 &IDTVEC(msi_intr151), 389 &IDTVEC(msi_intr152), 390 &IDTVEC(msi_intr153), 391 &IDTVEC(msi_intr154), 392 &IDTVEC(msi_intr155), 393 &IDTVEC(msi_intr156), 394 &IDTVEC(msi_intr157), 395 &IDTVEC(msi_intr158), 396 &IDTVEC(msi_intr159), 397 &IDTVEC(msi_intr160), 398 &IDTVEC(msi_intr161), 399 &IDTVEC(msi_intr162), 400 &IDTVEC(msi_intr163), 401 &IDTVEC(msi_intr164), 402 &IDTVEC(msi_intr165), 403 &IDTVEC(msi_intr166), 404 &IDTVEC(msi_intr167), 405 &IDTVEC(msi_intr168), 406 &IDTVEC(msi_intr169), 407 &IDTVEC(msi_intr170), 408 &IDTVEC(msi_intr171), 409 &IDTVEC(msi_intr172), 410 &IDTVEC(msi_intr173), 411 &IDTVEC(msi_intr174), 412 &IDTVEC(msi_intr175), 413 &IDTVEC(msi_intr176), 414 &IDTVEC(msi_intr177), 415 &IDTVEC(msi_intr178), 416 &IDTVEC(msi_intr179), 417 &IDTVEC(msi_intr180), 418 &IDTVEC(msi_intr181), 419 &IDTVEC(msi_intr182), 420 &IDTVEC(msi_intr183), 421 &IDTVEC(msi_intr184), 422 &IDTVEC(msi_intr185), 423 &IDTVEC(msi_intr186), 424 &IDTVEC(msi_intr187), 425 &IDTVEC(msi_intr188), 426 &IDTVEC(msi_intr189), 427 &IDTVEC(msi_intr190), 428 &IDTVEC(msi_intr191) 429 }; 430 431 void 432 msi_setup(int intr, int cpuid) 433 { 434 setidt(IDT_OFFSET + intr, msi_intr[intr], 435 SDT_SYSIGT, SEL_KPL, 0, cpuid); 436 } 437 438 void 439 msi_map(int intr, uint64_t *addr, uint32_t *data, int cpuid) 440 { 441 int vector, lapic_id; 442 443 vector = IDT_OFFSET + intr; 444 lapic_id = CPUID_TO_APICID(cpuid); 445 446 *addr = MSI_X86_ADDR(lapic_id); 447 *data = MSI_X86_DATA(vector); 448 } 449