Lines Matching +full:gpa +full:- +full:1
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
21 #include "pci_gvt-d-opregion.h"
40 0x00100000 /* Graphics Stolen Memory is 1 MB aligned */
45 #define GVT_D_MAP_OPREGION 1
53 case 1: in gvt_d_dsmbase_read()
69 case 1: in gvt_d_dsmbase_write()
86 struct passthru_softc *sc = pi->pi_arg; in set_bdsm_gen3()
94 bdsm_gpa | (bdsm & (PCIM_BDSM_GSM_ALIGNMENT - 1))); in set_bdsm_gen3()
108 struct passthru_softc *sc = pi->pi_arg; in set_bdsm_gen11()
116 bdsm_gpa | (bdsm & (PCIM_BDSM_GSM_ALIGNMENT - 1))); in set_bdsm_gen11()
195 struct passthru_softc *sc = pi->pi_arg; in get_igd_ops()
217 sc = pi->pi_arg; in gvt_d_probe()
258 * Intel itself maps it into the guest by EPT [1]. At the moment, we're not
263 * the graphics stolen memory [2]. As the GVT-d code doesn't support Tiger Lake
267 * [1]
268 …/github.com/projectacrn/acrn-hypervisor/blob/e28d6fbfdfd556ff1bc3ff330e41d4ddbaa0f897/devicemodel/…
270 …/github.com/projectacrn/acrn-hypervisor/blob/e28d6fbfdfd556ff1bc3ff330e41d4ddbaa0f897/devicemodel/…
281 sc = pi->pi_arg; in gvt_d_setup_gsm()
286 return (-1); in gvt_d_setup_gsm()
289 sysctl_len = sizeof(gsm->hpa); in gvt_d_setup_gsm()
290 error = sysctlbyname("hw.intel_graphics_stolen_base", &gsm->hpa, in gvt_d_setup_gsm()
295 return (-1); in gvt_d_setup_gsm()
297 sysctl_len = sizeof(gsm->len); in gvt_d_setup_gsm()
298 error = sysctlbyname("hw.intel_graphics_stolen_size", &gsm->len, in gvt_d_setup_gsm()
303 return (-1); in gvt_d_setup_gsm()
305 gsm->hva = NULL; /* unused */ in gvt_d_setup_gsm()
306 gsm->gva = NULL; /* unused */ in gvt_d_setup_gsm()
307 gsm->gpa = gvt_d_alloc_mmio_memory(gsm->hpa, gsm->len, in gvt_d_setup_gsm()
309 if (gsm->gpa == 0) { in gvt_d_setup_gsm()
312 __func__, gsm->hpa, gsm->len); in gvt_d_setup_gsm()
314 return (-1); in gvt_d_setup_gsm()
316 if (gsm->gpa != gsm->hpa) { in gvt_d_setup_gsm()
322 * 1. Patch the value in the MMIO register in gvt_d_setup_gsm()
330 * 3. Use an 1:1 host to guest mapping in gvt_d_setup_gsm()
332 * platform requires a 1:1 mapping. For that reason, just log a in gvt_d_setup_gsm()
343 return (-1); in gvt_d_setup_gsm()
346 return (igd_ops->set_bdsm(pi, gsm->gpa)); in gvt_d_setup_gsm()
356 sc = pi->pi_arg; in gvt_d_setup_vbt()
361 return (-1); in gvt_d_setup_vbt()
364 vbt->hpa = vbt_hpa; in gvt_d_setup_vbt()
365 vbt->len = vbt_len; in gvt_d_setup_vbt()
367 vbt->hva = mmap(NULL, vbt->len, PROT_READ, MAP_SHARED, memfd, vbt->hpa); in gvt_d_setup_vbt()
368 if (vbt->hva == MAP_FAILED) { in gvt_d_setup_vbt()
370 return (-1); in gvt_d_setup_vbt()
373 vbt->gpa = gvt_d_alloc_mmio_memory(vbt->hpa, vbt->len, in gvt_d_setup_vbt()
375 if (vbt->gpa == 0) { in gvt_d_setup_vbt()
378 __func__, vbt->hpa, vbt->len); in gvt_d_setup_vbt()
379 munmap(vbt->hva, vbt->len); in gvt_d_setup_vbt()
381 return (-1); in gvt_d_setup_vbt()
383 vbt->gva = vm_map_gpa(pi->pi_vmctx, vbt->gpa, vbt->len); in gvt_d_setup_vbt()
384 if (vbt->gva == NULL) { in gvt_d_setup_vbt()
386 munmap(vbt->hva, vbt->len); in gvt_d_setup_vbt()
387 return (-1); in gvt_d_setup_vbt()
390 if (vbt->gpa != vbt->hpa) { in gvt_d_setup_vbt()
392 * A 1:1 host to guest mapping is not required but this could in gvt_d_setup_vbt()
399 memcpy(vbt->gva, vbt->hva, vbt->len); in gvt_d_setup_vbt()
405 *vbt_gpa = vbt->gpa; in gvt_d_setup_vbt()
423 sc = pi->pi_arg; in gvt_d_setup_opregion()
428 return (-1); in gvt_d_setup_opregion()
435 return (-1); in gvt_d_setup_opregion()
445 return (-1); in gvt_d_setup_opregion()
447 if (memcmp(header->sign, IGD_OPREGION_HEADER_SIGN, in gvt_d_setup_opregion()
448 sizeof(header->sign)) != 0) { in gvt_d_setup_opregion()
452 return (-1); in gvt_d_setup_opregion()
455 opregion->hpa = asls; in gvt_d_setup_opregion()
456 opregion->len = header->size * KB; in gvt_d_setup_opregion()
459 if (opregion->len != sizeof(struct igd_opregion)) { in gvt_d_setup_opregion()
461 opregion->len); in gvt_d_setup_opregion()
463 return (-1); in gvt_d_setup_opregion()
466 opregion->hva = mmap(NULL, opregion->len, PROT_READ, MAP_SHARED, memfd, in gvt_d_setup_opregion()
467 opregion->hpa); in gvt_d_setup_opregion()
468 if (opregion->hva == MAP_FAILED) { in gvt_d_setup_opregion()
471 return (-1); in gvt_d_setup_opregion()
474 opregion_ptr = (struct igd_opregion *)opregion->hva; in gvt_d_setup_opregion()
475 if (opregion_ptr->mbox3.rvda != 0) { in gvt_d_setup_opregion()
482 if (opregion_ptr->header.over == 0x02000000) { in gvt_d_setup_opregion()
487 return (-1); in gvt_d_setup_opregion()
489 vbt_hpa = opregion->hpa + opregion_ptr->mbox3.rvda; in gvt_d_setup_opregion()
490 if (vbt_hpa < opregion->hpa) { in gvt_d_setup_opregion()
493 __func__, opregion->hpa, opregion_ptr->mbox3.rvda); in gvt_d_setup_opregion()
495 return (-1); in gvt_d_setup_opregion()
499 opregion_ptr->mbox3.rvds, &vbt_gpa)) != 0) { in gvt_d_setup_opregion()
507 opregion->gpa = gvt_d_alloc_mmio_memory(opregion->hpa, opregion->len, in gvt_d_setup_opregion()
509 if (opregion->gpa == 0) { in gvt_d_setup_opregion()
512 __func__, opregion->hpa, opregion->len); in gvt_d_setup_opregion()
514 return (-1); in gvt_d_setup_opregion()
516 opregion->gva = vm_map_gpa(pi->pi_vmctx, opregion->gpa, opregion->len); in gvt_d_setup_opregion()
517 if (opregion->gva == NULL) { in gvt_d_setup_opregion()
519 return (-1); in gvt_d_setup_opregion()
521 if (opregion->gpa != opregion->hpa) { in gvt_d_setup_opregion()
523 * A 1:1 host to guest mapping is not required but this could in gvt_d_setup_opregion()
530 memcpy(opregion->gva, opregion->hva, opregion->len); in gvt_d_setup_opregion()
536 if (vbt_gpa < opregion->gpa) { in gvt_d_setup_opregion()
539 __func__, vbt_gpa, opregion->gpa); in gvt_d_setup_opregion()
540 return (-1); in gvt_d_setup_opregion()
543 ((struct igd_opregion *)opregion->gva)->mbox3.rvda = vbt_gpa - opregion->gpa; in gvt_d_setup_opregion()
546 pci_set_cfgdata32(pi, PCIR_ASLS_CTL, opregion->gpa); in gvt_d_setup_opregion()
577 sc = pi->pi_arg; in gvt_d_deinit()
582 if (opregion->hva) in gvt_d_deinit()
583 munmap((void *)opregion->hva, opregion->len); in gvt_d_deinit()