11/* ++
22*
3- * Copyright © 2021 Intel Corporation
3+ * Copyright (C) 2021 Intel Corporation
44* SPDX-License-Identifier: MS-PL
55
66Module Name:
@@ -32,9 +32,6 @@ extern "C" {
3232#pragma alloc_text (PAGE, DVServerKMDQueueInitialize)
3333#endif
3434
35- extern GPU_DISP_MODE_EXT gpu_disp_mode_ext[MAX_MODELIST_SIZE];
36- extern output_modelist mode_list;
37-
3835NTSTATUS
3936DVServerKMDQueueInitialize (
4037 _In_ WDFDEVICE Device
@@ -154,8 +151,10 @@ Return Value:
154151 // method retrieves an I/O request's input buffer.
155152 // https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/wdfrequest/nf-wdfrequest-wdfrequestretrieveinputbuffer
156153 status = IoctlRequestPresentFb (pDeviceContext, InputBufferLength, OutputBufferLength, Request, &bytesReturned);
157- if (status != STATUS_SUCCESS)
154+ if (status != STATUS_SUCCESS) {
155+ ERR (" IoctlRequestPresentFb failed with status = %d\n " , status);
158156 return ;
157+ }
159158 status = WdfRequestRetrieveOutputBuffer (Request, 0 , (PVOID*)&resp, &bufSize);
160159 if (!NT_SUCCESS (status)) {
161160 ERR (" Couldn't retrieve Output buffer\n " );
@@ -232,6 +231,11 @@ Return Value:
232231 resp->retval = DVSERVERKMD_SUCCESS;
233232 WdfRequestSetInformation (Request, sizeof (struct KMDF_IOCTL_Response ));
234233 break ;
234+ case IOCTL_DVSERVER_GET_TOTAL_SCREENS:
235+ status = IoctlRequestTotalScreens (pDeviceContext, InputBufferLength, OutputBufferLength, Request, &bytesReturned);
236+ if (status != STATUS_SUCCESS)
237+ return ;
238+ break ;
235239 }
236240
237241 WdfRequestComplete (Request, STATUS_SUCCESS);
@@ -341,29 +345,40 @@ static NTSTATUS IoctlRequestSetMode(
341345 return STATUS_INVALID_USER_BUFFER;
342346 }
343347
348+ if (ptr->screen_num >= MAX_SCAN_OUT) {
349+ ERR (" Screen number provided by UMD: %d is greater than or equal to the maximum supported: %d by the KMD\n " ,
350+ ptr->screen_num , MAX_SCAN_OUT);
351+ WdfRequestComplete (Request, STATUS_INSUFFICIENT_RESOURCES);
352+ return status;
353+ }
354+
344355 CURRENT_MODE tempCurrentMode = { 0 };
345356 tempCurrentMode.DispInfo .Width = ptr->width ;
346357 tempCurrentMode.DispInfo .Height = ptr->height ;
347358 tempCurrentMode.DispInfo .Pitch = ptr->pitch ;
359+ tempCurrentMode.DispInfo .TargetId = ptr->screen_num ;
348360 tempCurrentMode.DispInfo .ColorFormat = (D3DDDIFORMAT) ptr->format ;
349361 tempCurrentMode.FrameBuffer .Ptr = (BYTE*)ptr->addr ;
350362
351363 status = pAdapter->SetCurrentModeExt (&tempCurrentMode);
352- if (status != STATUS_SUCCESS)
364+ if (status != STATUS_SUCCESS) {
365+ ERR (" SetCurrentModeExt failed with status = %d\n " , status);
353366 return STATUS_UNSUCCESSFUL;
367+ }
354368
355369 // BlackOutScreen
356370 CURRENT_MODE CurrentMode = { 0 };
357371 CurrentMode.DispInfo .Width = ptr->width ;
358372 CurrentMode.DispInfo .Height = ptr->height ;
359373 CurrentMode.DispInfo .Pitch = ptr->pitch ;
360- CurrentMode.FrameBuffer .Ptr = pAdapter->m_FrameSegment .GetFbVAddr ();
374+ CurrentMode.DispInfo .TargetId = ptr->screen_num ;
375+ CurrentMode.FrameBuffer .Ptr = pAdapter->GetFbVAddr (ptr->screen_num );
361376 CurrentMode.Flags .FrameBufferIsActive = 1 ;
362377
363378 pAdapter->BlackOutScreen (&CurrentMode);
364379
365380 if (tempCurrentMode.FrameBuffer .Ptr ) {
366- pAdapter->m_FrameSegment . Close ();
381+ pAdapter->Close (ptr-> screen_num );
367382 }
368383
369384 return STATUS_SUCCESS;
@@ -387,7 +402,7 @@ static NTSTATUS IoctlRequestPresentFb(
387402 (VioGpuAdapterLite*)(DeviceContext ? DeviceContext->pvDeviceExtension : 0 );
388403
389404 if (!pAdapter) {
390- ERR (" Coudlnt ' find adapter\n " );
405+ ERR (" Couldnt ' find adapter\n " );
391406 return status;
392407 }
393408
@@ -398,15 +413,24 @@ static NTSTATUS IoctlRequestPresentFb(
398413 return STATUS_INVALID_USER_BUFFER;
399414 }
400415
416+ if (ptr->screen_num >= MAX_SCAN_OUT) {
417+ ERR (" Screen number provided by UMD: %d is greater than or equal to the maximum supported: %d by the KMD\n " ,
418+ ptr->screen_num , MAX_SCAN_OUT);
419+ WdfRequestComplete (Request, STATUS_INSUFFICIENT_RESOURCES);
420+ return status;
421+ }
401422 status = pAdapter->ExecutePresentDisplayZeroCopy (
402423 (BYTE*)ptr->addr ,
403424 ptr->bitrate ,
404425 ptr->pitch ,
405426 ptr->width ,
406- ptr->height );
427+ ptr->height ,
428+ ptr->screen_num );
407429
408- if (status != STATUS_SUCCESS)
430+ if (status != STATUS_SUCCESS) {
431+ ERR (" ExecutePresentDisplayZeroCopy failed with status = %d\n " , status);
409432 return STATUS_UNSUCCESSFUL;
433+ }
410434
411435 return STATUS_SUCCESS;
412436}
@@ -446,36 +470,78 @@ static NTSTATUS IoctlRequestEdid(
446470 WdfRequestComplete (Request, STATUS_INSUFFICIENT_RESOURCES);
447471 return status;
448472 }
473+
474+ if (edata->screen_num >= MAX_SCAN_OUT) {
475+ ERR (" Screen number provided by UMD: %d is greater than or equal to the maximum supported: %d by the KMD\n " ,
476+ edata->screen_num , MAX_SCAN_OUT);
477+ WdfRequestComplete (Request, STATUS_INSUFFICIENT_RESOURCES);
478+ return status;
479+ }
480+
449481 if (edata->mode_size == 0 ) {
450482 status = WdfRequestRetrieveOutputBuffer (Request, 0 , (PVOID*)&edata, &bufSize);
451483 if (!NT_SUCCESS (status)) {
452484 ERR (" Couldn't retrieve Output buffer\n " );
453485 WdfRequestComplete (Request, STATUS_INSUFFICIENT_RESOURCES);
454486 return status;
455487 }
488+
456489 // Return value from the KMDF DVServer
457- if (mode_list. modelist_size != 0 ) {
458- edata->mode_size = mode_list. modelist_size ;
490+ if (pAdapter-> GetModeListSize (edata-> screen_num ) != 0 ) {
491+ edata->mode_size = pAdapter-> GetModeListSize (edata-> screen_num ) ;
459492 } else {
460493 edata->mode_size = QEMU_MODELIST_SIZE;
461494 }
462495 WdfRequestSetInformation (Request, sizeof (struct edid_info ));
463- } else if ((edata->mode_size == mode_list. modelist_size ) || (edata->mode_size == QEMU_MODELIST_SIZE)) {
496+ } else if ((edata->mode_size == pAdapter-> GetModeListSize (edata-> screen_num ) ) || (edata->mode_size == QEMU_MODELIST_SIZE)) {
464497 status = WdfRequestRetrieveOutputBuffer (Request, 0 , (PVOID*)&edata, &bufSize);
465498 if (!NT_SUCCESS (status)) {
466499 ERR (" Couldn't retrieve Output buffer\n " );
467500 WdfRequestComplete (Request, STATUS_INSUFFICIENT_RESOURCES);
468501 return status;
469502 }
470503 // Return value from the KMDF DVServer
471- RtlCopyMemory (edata->edid_data , pAdapter->GetEdidData (0 ), EDID_V1_BLOCK_SIZE);
504+ RtlCopyMemory (edata->edid_data , pAdapter->GetEdidData (edata-> screen_num ), EDID_V1_BLOCK_SIZE);
472505
473- for (unsigned int i = 0 ; i < edata->mode_size ; i++) {
474- edata->mode_list [i].width = gpu_disp_mode_ext[i].XResolution ;
475- edata->mode_list [i].height = gpu_disp_mode_ext[i].YResolution ;
476- edata->mode_list [i].refreshrate = gpu_disp_mode_ext[i].refresh ;
477- }
506+ pAdapter->CopyResolution (edata->screen_num , edata);
478507 WdfRequestSetInformation (Request, sizeof (struct edid_info ));
479508 }
480509 return STATUS_SUCCESS;
481510}
511+
512+ static NTSTATUS IoctlRequestTotalScreens (
513+ const PDEVICE_CONTEXT DeviceContext,
514+ const size_t InputBufferLength,
515+ const size_t OutputBufferLength,
516+ const WDFREQUEST Request,
517+ size_t * BytesReturned)
518+ {
519+ UNREFERENCED_PARAMETER (DeviceContext);
520+ UNREFERENCED_PARAMETER (InputBufferLength);
521+ UNREFERENCED_PARAMETER (OutputBufferLength);
522+ UNREFERENCED_PARAMETER (BytesReturned);
523+
524+ NTSTATUS status = STATUS_UNSUCCESSFUL;
525+ struct screen_info * mdata = NULL ;
526+ size_t bufSize;
527+
528+ VioGpuAdapterLite* pAdapter =
529+ (VioGpuAdapterLite*)(DeviceContext ? DeviceContext->pvDeviceExtension : 0 );
530+
531+ if (!pAdapter) {
532+ ERR (" Coudlnt' find adapter\n " );
533+ return status;
534+ }
535+
536+ status = WdfRequestRetrieveOutputBuffer (Request, 0 , (PVOID*)&mdata, &bufSize);
537+ if (!NT_SUCCESS (status)) {
538+ WdfRequestComplete (Request, STATUS_INSUFFICIENT_RESOURCES);
539+ return status;
540+
541+ }
542+
543+ mdata->total_screens = pAdapter->GetNumScreens ();
544+ WdfRequestSetInformation (Request, sizeof (struct screen_info ));
545+
546+ return STATUS_SUCCESS;
547+ }
0 commit comments