DM: gvt: Identical mapping for GPU DSM refine to support EHL/TGL

Windows graphic driver obtains DSM address from in-BAR mmio register
which has passthroughed. Not like the other platforms obtained from
pci configure space register which has virtualized. GPU GuC must use
WOPCM in DSM, besides, Windows OS wants to manage DSM also. These two
reason force acrn has to keep identical mapping to avoid trap mmio
BAR to do the emulation.

Tracked-On: #5880
Signed-off-by: Peng Sun <peng.p.sun@intel.com>
This commit is contained in:
ppsun
2021-03-29 08:53:29 +00:00
committed by wenlingz
parent b80c388b52
commit 2a96c567b8
7 changed files with 148 additions and 111 deletions

View File

@@ -1095,13 +1095,13 @@ int create_and_inject_vrtct(struct vmctx *ctx)
uint8_t *vrtct;
struct vm_memmap memmap = {
.type = VM_MMIO,
.gpa = SOFTWARE_SRAM_BASE_GPA,
/* HPA base and size of Software SRAM shall be parsed from vRTCT. */
.hpa = 0,
.len = 0,
.prot = PROT_ALL
};
memmap.gpa = get_software_sram_base_gpa();
native_rtct_fd = open(RTCT_NATIVE_FILE_PATH_IN_SOS, O_RDONLY);
if (native_rtct_fd < 0) {
pr_err("failed to open /sys/firmware/acpi/tables/PTCT !!!!! errno:%d\n", errno);

View File

@@ -35,6 +35,7 @@
static uint64_t software_sram_base_hpa;
static uint64_t software_sram_size;
static uint64_t software_sram_base_gpa;
static uint8_t vrtct_checksum(uint8_t *vrtct, uint32_t length)
{
@@ -209,7 +210,7 @@ static void remap_software_sram_regions(struct acpi_table_hdr *vrtct)
foreach_rtct_entry(vrtct, entry) {
if (entry->type == RTCT_ENTRY_TYPE_PSRAM) {
sw_sram_region = (struct rtct_entry_data_psram *)entry->data;
sw_sram_region->base = SOFTWARE_SRAM_BASE_GPA + (sw_sram_region->base - hpa_bottom);
sw_sram_region->base = software_sram_base_gpa + (sw_sram_region->base - hpa_bottom);
}
}
}
@@ -287,6 +288,11 @@ uint64_t get_software_sram_base_hpa(void)
return software_sram_base_hpa;
}
uint64_t get_software_sram_base_gpa(void)
{
return software_sram_base_gpa;
}
uint64_t get_software_sram_size(void)
{
return software_sram_size;
@@ -306,6 +312,7 @@ uint8_t *build_vrtct(struct vmctx *ctx, void *cfg)
struct acrn_vm_config vm_cfg;
struct acpi_table_hdr *rtct_cfg, *vrtct = NULL;
uint64_t dm_cpu_bitmask, hv_cpu_bitmask, guest_pcpu_bitmask;
uint32_t gpu_rsvmem_base_gpa = 0;
if ((cfg == NULL) || (ctx == NULL))
return NULL;
@@ -351,6 +358,14 @@ uint8_t *build_vrtct(struct vmctx *ctx, void *cfg)
pr_info("%s, dm_cpu_bitmask:0x%x, hv_cpu_bitmask:0x%x, guest_cpu_bitmask: 0x%x\n",
__func__, dm_cpu_bitmask, hv_cpu_bitmask, guest_pcpu_bitmask);
gpu_rsvmem_base_gpa = get_gpu_rsvmem_base_gpa();
software_sram_size = SOFTWARE_SRAM_MAX_SIZE;
/* TODO: It is better to put one boundary between GPU region and SW SRAM
* for protection.
*/
software_sram_base_gpa = ((gpu_rsvmem_base_gpa ? gpu_rsvmem_base_gpa : 0x80000000UL) -
software_sram_size) & ~software_sram_size;
if (passthru_rtct_to_guest(vrtct, rtct_cfg, guest_pcpu_bitmask)) {
pr_err("%s, initialize vRTCT fail.", __func__);
goto error;