Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions DVApp.ps1
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#===========================================================================
#DVApp.ps1
#----------------------------------------------------------------------------
#* Copyright © 2021 Intel Corporation
#Copyright (C) 2021 Intel Corporation
#SPDX-License-Identifier: MIT
#--------------------------------------------------------------------------*/

Expand Down Expand Up @@ -57,7 +57,12 @@ function create_node()
Write-Host "Turning off MSFT Path"

& ".\DVEnabler.exe"
return "SUCCESS"
if ($LASTEXITCODE -eq 0) {
return "SUCCESS"
} else {
Write-Host "DVEnabler failed. DVServerUMD has not taken over MSBDA!"
return "FAIL"
}
}

#This API will execute the setup/run commands
Expand Down
2 changes: 1 addition & 1 deletion DVInstaller.ps1
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#===========================================================================
#DVInstaller.ps1
#----------------------------------------------------------------------------
#* Copyright © 2021 Intel Corporation
#Copyright (C) 2021 Intel Corporation
#SPDX-License-Identifier: MIT
#--------------------------------------------------------------------------*/

Expand Down
1 change: 1 addition & 0 deletions DVServerKMD/DVServerKMD.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@
<WppScanConfigurationData Condition="'%(ClCompile.ScanConfigurationData)' == ''">trace.h</WppScanConfigurationData>
<WppKernelMode>true</WppKernelMode>
<AdditionalIncludeDirectories>C:\Program Files %28x86%29\Windows Kits\10\Include\10.0.19041.0\um;C:\Program Files %28x86%29\Windows Kits\10\Include\10.0.19041.0\km;..\VirtIO;..\EDIDParser;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>_WIN64;_AMD64_;AMD64;%(PreprocessorDefinitions);__DEBUG</PreprocessorDefinitions>
</ClCompile>
<Link>
<AdditionalDependencies>virtiolib.lib;edidparser.lib;%(AdditionalDependencies)</AdditionalDependencies>
Expand Down
2 changes: 1 addition & 1 deletion DVServerKMD/DVServerKMD_Version.txt
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*===========================================================================
; DVServerKMD_Version.txt
;----------------------------------------------------------------------------
; * Copyright 2021 Intel Corporation
; Copyright (C) 2021 Intel Corporation
; SPDX-License-Identifier: BSD-3-Clause
;
; File Description:
Expand Down
20 changes: 14 additions & 6 deletions DVServerKMD/Public.h
Original file line number Diff line number Diff line change
Expand Up @@ -24,12 +24,14 @@ DEFINE_GUID (GUID_DEVINTERFACE_DVServerKMD,
0x1c514918,0xa855,0x460a,0x97,0xda,0xed,0x69,0x1d,0xd5,0x63,0xcf);
// {1c514918-a855-460a-97da-ed691dd563cf}

#define IOCTL_DVSERVER_FRAME_DATA CTL_CODE(FILE_DEVICE_UNKNOWN, 0x807, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_DVSERVER_CURSOR_DATA CTL_CODE(FILE_DEVICE_UNKNOWN, 0x808, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_DVSERVER_GET_EDID_DATA CTL_CODE(FILE_DEVICE_UNKNOWN, 0x809, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_DVSERVER_SET_MODE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_DVSERVER_GENERAL CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_DVSERVER_TEST_IMAGE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define MAX_SCAN_OUT 4
#define IOCTL_DVSERVER_FRAME_DATA CTL_CODE(FILE_DEVICE_UNKNOWN, 0x807, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_DVSERVER_CURSOR_DATA CTL_CODE(FILE_DEVICE_UNKNOWN, 0x808, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_DVSERVER_GET_EDID_DATA CTL_CODE(FILE_DEVICE_UNKNOWN, 0x809, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_DVSERVER_SET_MODE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x810, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_DVSERVER_GENERAL CTL_CODE(FILE_DEVICE_UNKNOWN, 0x811, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_DVSERVER_TEST_IMAGE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x812, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_DVSERVER_GET_TOTAL_SCREENS CTL_CODE(FILE_DEVICE_UNKNOWN, 0x813, METHOD_BUFFERED, FILE_ANY_ACCESS)

typedef struct FrameMetaData
{
Expand All @@ -41,6 +43,7 @@ typedef struct FrameMetaData
UINT16 bitrate;
void* addr;
unsigned short refresh_rate;
unsigned int screen_num;

}FrameMetaData;

Expand Down Expand Up @@ -68,9 +71,14 @@ struct edid_info
{
unsigned char edid_data[256];
unsigned int mode_size;
unsigned int screen_num;
mode_info* mode_list;
};

struct screen_info
{
unsigned int total_screens;
};

struct KMDF_IOCTL_Response
{
Expand Down
106 changes: 86 additions & 20 deletions DVServerKMD/Queue.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/*++
*
* Copyright 2021 Intel Corporation
* Copyright (C) 2021 Intel Corporation
* SPDX-License-Identifier: MS-PL

Module Name:
Expand Down Expand Up @@ -32,9 +32,6 @@ extern "C" {
#pragma alloc_text (PAGE, DVServerKMDQueueInitialize)
#endif

extern GPU_DISP_MODE_EXT gpu_disp_mode_ext[MAX_MODELIST_SIZE];
extern output_modelist mode_list;

NTSTATUS
DVServerKMDQueueInitialize(
_In_ WDFDEVICE Device
Expand Down Expand Up @@ -154,8 +151,10 @@ Return Value:
// method retrieves an I/O request's input buffer.
// https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdfrequest/nf-wdfrequest-wdfrequestretrieveinputbuffer
status = IoctlRequestPresentFb(pDeviceContext, InputBufferLength, OutputBufferLength, Request, &bytesReturned);
if (status != STATUS_SUCCESS)
if (status != STATUS_SUCCESS) {
ERR("IoctlRequestPresentFb failed with status = %d\n", status);
return;
}
status = WdfRequestRetrieveOutputBuffer(Request, 0, (PVOID*)&resp, &bufSize);
if (!NT_SUCCESS(status)) {
ERR("Couldn't retrieve Output buffer\n");
Expand Down Expand Up @@ -232,6 +231,11 @@ Return Value:
resp->retval = DVSERVERKMD_SUCCESS;
WdfRequestSetInformation(Request, sizeof(struct KMDF_IOCTL_Response));
break;
case IOCTL_DVSERVER_GET_TOTAL_SCREENS:
status = IoctlRequestTotalScreens(pDeviceContext, InputBufferLength, OutputBufferLength, Request, &bytesReturned);
if (status != STATUS_SUCCESS)
return;
break;
}

WdfRequestComplete(Request, STATUS_SUCCESS);
Expand Down Expand Up @@ -341,29 +345,40 @@ static NTSTATUS IoctlRequestSetMode(
return STATUS_INVALID_USER_BUFFER;
}

if (ptr->screen_num >= MAX_SCAN_OUT) {
ERR("Screen number provided by UMD: %d is greater than or equal to the maximum supported: %d by the KMD\n",
ptr->screen_num, MAX_SCAN_OUT);
WdfRequestComplete(Request, STATUS_INSUFFICIENT_RESOURCES);
return status;
}

CURRENT_MODE tempCurrentMode = { 0 };
tempCurrentMode.DispInfo.Width = ptr->width;
tempCurrentMode.DispInfo.Height = ptr->height;
tempCurrentMode.DispInfo.Pitch = ptr->pitch;
tempCurrentMode.DispInfo.TargetId = ptr->screen_num;
tempCurrentMode.DispInfo.ColorFormat = (D3DDDIFORMAT) ptr->format;
tempCurrentMode.FrameBuffer.Ptr = (BYTE*)ptr->addr;

status = pAdapter->SetCurrentModeExt(&tempCurrentMode);
if (status != STATUS_SUCCESS)
if (status != STATUS_SUCCESS) {
ERR("SetCurrentModeExt failed with status = %d\n", status);
return STATUS_UNSUCCESSFUL;
}

// BlackOutScreen
CURRENT_MODE CurrentMode = { 0 };
CurrentMode.DispInfo.Width = ptr->width;
CurrentMode.DispInfo.Height = ptr->height;
CurrentMode.DispInfo.Pitch = ptr->pitch;
CurrentMode.FrameBuffer.Ptr = pAdapter->m_FrameSegment.GetFbVAddr();
CurrentMode.DispInfo.TargetId = ptr->screen_num;
CurrentMode.FrameBuffer.Ptr = pAdapter->GetFbVAddr(ptr->screen_num);
CurrentMode.Flags.FrameBufferIsActive = 1;

pAdapter->BlackOutScreen(&CurrentMode);

if (tempCurrentMode.FrameBuffer.Ptr) {
pAdapter->m_FrameSegment.Close();
pAdapter->Close(ptr->screen_num);
}

return STATUS_SUCCESS;
Expand All @@ -387,7 +402,7 @@ static NTSTATUS IoctlRequestPresentFb(
(VioGpuAdapterLite*)(DeviceContext ? DeviceContext->pvDeviceExtension : 0);

if (!pAdapter) {
ERR("Coudlnt' find adapter\n");
ERR("Couldnt' find adapter\n");
return status;
}

Expand All @@ -398,15 +413,24 @@ static NTSTATUS IoctlRequestPresentFb(
return STATUS_INVALID_USER_BUFFER;
}

if (ptr->screen_num >= MAX_SCAN_OUT) {
ERR("Screen number provided by UMD: %d is greater than or equal to the maximum supported: %d by the KMD\n",
ptr->screen_num, MAX_SCAN_OUT);
WdfRequestComplete(Request, STATUS_INSUFFICIENT_RESOURCES);
return status;
}
status = pAdapter->ExecutePresentDisplayZeroCopy(
(BYTE*)ptr->addr,
ptr->bitrate,
ptr->pitch,
ptr->width,
ptr->height);
ptr->height,
ptr->screen_num);

if (status != STATUS_SUCCESS)
if (status != STATUS_SUCCESS) {
ERR("ExecutePresentDisplayZeroCopy failed with status = %d\n", status);
return STATUS_UNSUCCESSFUL;
}

return STATUS_SUCCESS;
}
Expand Down Expand Up @@ -446,36 +470,78 @@ static NTSTATUS IoctlRequestEdid(
WdfRequestComplete(Request, STATUS_INSUFFICIENT_RESOURCES);
return status;
}

if (edata->screen_num >= MAX_SCAN_OUT) {
ERR("Screen number provided by UMD: %d is greater than or equal to the maximum supported: %d by the KMD\n",
edata->screen_num, MAX_SCAN_OUT);
WdfRequestComplete(Request, STATUS_INSUFFICIENT_RESOURCES);
return status;
}

if (edata->mode_size == 0) {
status = WdfRequestRetrieveOutputBuffer(Request, 0, (PVOID*)&edata, &bufSize);
if (!NT_SUCCESS(status)) {
ERR("Couldn't retrieve Output buffer\n");
WdfRequestComplete(Request, STATUS_INSUFFICIENT_RESOURCES);
return status;
}

//Return value from the KMDF DVServer
if (mode_list.modelist_size != 0) {
edata->mode_size = mode_list.modelist_size;
if(pAdapter->GetModeListSize(edata->screen_num) != 0) {
edata->mode_size = pAdapter->GetModeListSize(edata->screen_num);
} else {
edata->mode_size = QEMU_MODELIST_SIZE;
}
WdfRequestSetInformation(Request, sizeof(struct edid_info));
} else if ((edata->mode_size == mode_list.modelist_size) || (edata->mode_size == QEMU_MODELIST_SIZE)) {
} else if ((edata->mode_size == pAdapter->GetModeListSize(edata->screen_num)) || (edata->mode_size == QEMU_MODELIST_SIZE)) {
status = WdfRequestRetrieveOutputBuffer(Request, 0, (PVOID*)&edata, &bufSize);
if (!NT_SUCCESS(status)) {
ERR("Couldn't retrieve Output buffer\n");
WdfRequestComplete(Request, STATUS_INSUFFICIENT_RESOURCES);
return status;
}
//Return value from the KMDF DVServer
RtlCopyMemory(edata->edid_data, pAdapter->GetEdidData(0), EDID_V1_BLOCK_SIZE);
RtlCopyMemory(edata->edid_data, pAdapter->GetEdidData(edata->screen_num), EDID_V1_BLOCK_SIZE);

for (unsigned int i = 0; i < edata->mode_size; i++) {
edata->mode_list[i].width = gpu_disp_mode_ext[i].XResolution;
edata->mode_list[i].height = gpu_disp_mode_ext[i].YResolution;
edata->mode_list[i].refreshrate = gpu_disp_mode_ext[i].refresh;
}
pAdapter->CopyResolution(edata->screen_num, edata);
WdfRequestSetInformation(Request, sizeof(struct edid_info));
}
return STATUS_SUCCESS;
}

static NTSTATUS IoctlRequestTotalScreens(
const PDEVICE_CONTEXT DeviceContext,
const size_t InputBufferLength,
const size_t OutputBufferLength,
const WDFREQUEST Request,
size_t* BytesReturned)
{
UNREFERENCED_PARAMETER(DeviceContext);
UNREFERENCED_PARAMETER(InputBufferLength);
UNREFERENCED_PARAMETER(OutputBufferLength);
UNREFERENCED_PARAMETER(BytesReturned);

NTSTATUS status = STATUS_UNSUCCESSFUL;
struct screen_info* mdata = NULL;
size_t bufSize;

VioGpuAdapterLite* pAdapter =
(VioGpuAdapterLite*)(DeviceContext ? DeviceContext->pvDeviceExtension : 0);

if (!pAdapter) {
ERR("Coudlnt' find adapter\n");
return status;
}

status = WdfRequestRetrieveOutputBuffer(Request, 0, (PVOID*)&mdata, &bufSize);
if (!NT_SUCCESS(status)) {
WdfRequestComplete(Request, STATUS_INSUFFICIENT_RESOURCES);
return status;

}

mdata->total_screens = pAdapter->GetNumScreens();
WdfRequestSetInformation(Request, sizeof(struct screen_info));

return STATUS_SUCCESS;
}
7 changes: 7 additions & 0 deletions DVServerKMD/Queue.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,13 @@ static NTSTATUS IoctlRequestEdid(
const WDFREQUEST Request,
size_t* BytesReturned);

static NTSTATUS IoctlRequestTotalScreens(
const PDEVICE_CONTEXT DeviceContext,
const size_t InputBufferLength,
const size_t OutputBufferLength,
const WDFREQUEST Request,
size_t * BytesReturned);

//
// Events from the IoQueue object
//
Expand Down
10 changes: 10 additions & 0 deletions DVServerKMD/debug.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
/*===========================================================================
; debug.h
;----------------------------------------------------------------------------
; Copyright (C) 2021 Intel Corporation
; SPDX-License-Identifier: BSD-3-Clause
;
; File Description:
; This file declares and defines the devserverkmd logging macros
;--------------------------------------------------------------------------*/

#ifndef _DEBUG_H
#define _DEBUG_H

Expand Down
2 changes: 1 addition & 1 deletion DVServerKMD/edid.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*===========================================================================
; edid.h
;----------------------------------------------------------------------------
; * Copyright 2021 Intel Corporation
; Copyright (C) 2021 Intel Corporation
; SPDX-License-Identifier: BSD-3-Clause
;--------------------------------------------------------------------------*/

Expand Down
1 change: 0 additions & 1 deletion DVServerKMD/helper.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,6 @@ extern "C" {
#include <evntrace.h>
}

#define MAX_CHILDREN 4
#define MAX_VIEWS 1
#define BITS_PER_BYTE 8

Expand Down
2 changes: 1 addition & 1 deletion DVServerKMD/qemu_edid.h
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/*===========================================================================
; qemu_edid.h
;----------------------------------------------------------------------------
; * Copyright 2021 Intel Corporation
; Copyright (C) 2021 Intel Corporation
; SPDX-License-Identifier: BSD-3-Clause
;--------------------------------------------------------------------------*/

Expand Down
Loading