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