summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArnon Gilboa <agilboa@redhat.com>2013-06-02 16:46:53 +0300
committerArnon Gilboa <agilboa@redhat.com>2013-06-02 16:46:53 +0300
commit76491e6af87079552aa5a5f5bdf7d77c6983bfdd (patch)
treecdefe438cbe126b0f7d3f600aa4b47609b2e67be
parentb25dfe5e03fc09d9e6e6c9752e0b83433e17a4aa (diff)
init ram & vram memslots
-rw-r--r--C++/bdd.cxx47
-rw-r--r--[-rwxr-xr-x]C++/bdd.hxx14
-rw-r--r--[-rwxr-xr-x]C++/bdd_ddi.cxx2
-rw-r--r--[-rwxr-xr-x]C++/bdd_dmm.cxx6
4 files changed, 63 insertions, 6 deletions
diff --git a/C++/bdd.cxx b/C++/bdd.cxx
index 4268c0c..665dc48 100644
--- a/C++/bdd.cxx
+++ b/C++/bdd.cxx
@@ -95,11 +95,35 @@ error:
return status;
}
+// TODO: support async
+VOID BASIC_DISPLAY_DRIVER::QxlWritePortUchar(UINT qxl_port, UCHAR val)
+{
+ UINT64 port;
+
+ port = (UINT64)m_mem_regions[QXL_IO_RANGE_INDEX].mapped_start + qxl_port;
+ WRITE_PORT_UCHAR((PUCHAR)port, val);
+}
+
+VOID BASIC_DISPLAY_DRIVER::QxlMemRegionInitHighBits(QxlMemRegionInfo *mem_region,
+ UINT8 slot_id)
+{
+ UINT64 high_bits;
+
+ mem_region->slot_id = slot_id;
+ mem_region->generation = m_rom->slot_generation;
+
+ high_bits = slot_id << m_rom->slot_gen_bits;
+ high_bits |= mem_region->generation;
+ high_bits <<= (64 - (m_rom->slot_gen_bits + m_rom->slot_id_bits));
+ mem_region->high_bits = high_bits;
+}
+
NTSTATUS BASIC_DISPLAY_DRIVER::QxlInitRam()
{
QXLRam *ram_header;
NTSTATUS status;
+
PAGED_CODE();
LogMessage("%s\n", __FUNCTION__);
if (m_rom == NULL) {
@@ -133,6 +157,14 @@ NTSTATUS BASIC_DISPLAY_DRIVER::QxlInitRam()
goto error;
}
m_ram_header = ram_header;
+
+ m_ram_header->mem_slot.mem_start = m_mem_regions[QXL_RAM_RANGE_INDEX].phys_start.QuadPart;
+ m_ram_header->mem_slot.mem_end = m_ram_header->mem_slot.mem_start +
+ m_rom->surface0_area_size + m_rom->num_pages * PAGE_SIZE;
+
+ QxlMemRegionInitHighBits(&m_mem_regions[QXL_RAM_RANGE_INDEX], m_rom->slots_start);
+
+
return STATUS_SUCCESS;
error:
m_DxgkInterface.DxgkCbUnmapMemory(m_DxgkInterface.DeviceHandle,
@@ -158,6 +190,8 @@ NTSTATUS BASIC_DISPLAY_DRIVER::QxlInitVram()
LogMessage("%s: error mapping vram\n", __FUNCTION__);
return status;
}
+
+ QxlMemRegionInitHighBits(&m_mem_regions[QXL_VRAM_RANGE_INDEX], m_rom->slots_start + 1);
return STATUS_SUCCESS;
}
@@ -214,6 +248,15 @@ NTSTATUS BASIC_DISPLAY_DRIVER::QxlInit()
goto error;
}
+ m_va_slot_mask = (~(QXLPHYSICAL)0) >> (m_rom->slot_id_bits + m_rom->slot_gen_bits);
+ if (m_mem_regions[QXL_RAM_RANGE_INDEX].mapped_start) {
+ // TODO: support async
+ QxlWritePortUchar(QXL_IO_MEMSLOT_ADD, m_mem_regions[QXL_RAM_RANGE_INDEX].slot_id);
+ }
+ if (m_mem_regions[QXL_VRAM_RANGE_INDEX].mapped_start) {
+ // TODO: support async
+ QxlWritePortUchar(QXL_IO_MEMSLOT_ADD, m_mem_regions[QXL_VRAM_RANGE_INDEX].slot_id);
+ }
// TODO: memslots
return STATUS_SUCCESS;
// TODO: share validity check code with XDDM. XDDM assumes the rom is mapped before the ram
@@ -232,6 +275,10 @@ VOID BASIC_DISPLAY_DRIVER::QxlCleanup()
if (m_mem_regions[i].mapped_start) {
m_DxgkInterface.DxgkCbUnmapMemory(m_DxgkInterface.DeviceHandle,
m_mem_regions[i].mapped_start);
+ if (i == QXL_RAM_RANGE_INDEX || i == QXL_VRAM_RANGE_INDEX) {
+ LogMessage("%s MEMSLOT_DEL\n", __FUNCTION__);
+ QxlWritePortUchar(QXL_IO_MEMSLOT_DEL, m_mem_regions[i].slot_id);
+ }
}
}
RtlZeroMemory(m_mem_regions, sizeof(m_mem_regions));
diff --git a/C++/bdd.hxx b/C++/bdd.hxx
index 9c4c01e..87eaf2f 100755..100644
--- a/C++/bdd.hxx
+++ b/C++/bdd.hxx
@@ -174,6 +174,11 @@ typedef struct QxlMemRegionInfo {
PHYSICAL_ADDRESS phys_start;
PVOID mapped_start;
ULONG size;
+
+ /* vram + ram unique fields */
+ UINT8 slot_id;
+ UINT8 generation;
+ UINT64 high_bits;
} QxlMemRegionInfo;
class BASIC_DISPLAY_DRIVER
@@ -216,6 +221,7 @@ private:
QXLModes *m_rom_modes;
UCHAR m_pci_revision;
+ QXLPHYSICAL m_va_slot_mask;
public:
BASIC_DISPLAY_DRIVER(_In_ DEVICE_OBJECT* pPhysicalDeviceObject);
@@ -403,7 +409,8 @@ private:
// Set the information in the registry as described here: http://msdn.microsoft.com/en-us/library/windows/hardware/ff569240(v=vs.85).aspx
NTSTATUS RegisterHWInfo();
-
+ VOID QxlMemRegionInitHighBits(QxlMemRegionInfo *mem_region,
+ UINT8 slot_id);
NTSTATUS QxlInit();
NTSTATUS QxlInitRam();
NTSTATUS QxlInitRom();
@@ -413,7 +420,10 @@ private:
VOID QxlCleanup();
- VOID QxlWritePortUint16(UINT16 port, UINT16 val);
+ // TODO: remove use (or try to use WRITE_PORT_X)
+ VOID QxlVgaWritePortUint16(UINT16 port, UINT16 val);
+
+ VOID QxlWritePortUchar(UINT qxl_port, UCHAR val);
};
//
diff --git a/C++/bdd_ddi.cxx b/C++/bdd_ddi.cxx
index a6e167e..fbc3898 100755..100644
--- a/C++/bdd_ddi.cxx
+++ b/C++/bdd_ddi.cxx
@@ -88,7 +88,7 @@ VOID CreateLog(VOID)
RtlInitUnicodeString(&LogFileString, LOG_FILE_NAME);
InitializeObjectAttributes(&LogFileAttr, &LogFileString, OBJ_CASE_INSENSITIVE, NULL, NULL);
- ZwCreateFile(&hLogFile, FILE_APPEND_DATA, &LogFileAttr, &IoStatus, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_WRITE,
+ ZwCreateFile(&hLogFile, FILE_APPEND_DATA, &LogFileAttr, &IoStatus, NULL, FILE_ATTRIBUTE_NORMAL, FILE_SHARE_READ,
FILE_OPEN_IF, FILE_SYNCHRONOUS_IO_NONALERT, NULL, 0);
}
diff --git a/C++/bdd_dmm.cxx b/C++/bdd_dmm.cxx
index a1d444a..928ca14 100755..100644
--- a/C++/bdd_dmm.cxx
+++ b/C++/bdd_dmm.cxx
@@ -742,7 +742,7 @@ NTSTATUS BASIC_DISPLAY_DRIVER::UpdateActiveVidPnPresentPath(_In_ CONST DXGKARG_U
//
// Private BDD DMM functions
//
-VOID BASIC_DISPLAY_DRIVER::QxlWritePortUint16(UINT16 port, UINT16 val)
+VOID BASIC_DISPLAY_DRIVER::QxlVgaWritePortUint16(UINT16 port, UINT16 val)
{
__asm
{
@@ -752,8 +752,8 @@ VOID BASIC_DISPLAY_DRIVER::QxlWritePortUint16(UINT16 port, UINT16 val)
}
}
-#define WRITE_PORT_VBE_INDEX(index) QxlWritePortUint16(0x1ce, index);
-#define WRITE_PORT_VBE_DATA(data) QxlWritePortUint16(0x1cf, data);
+#define WRITE_PORT_VBE_INDEX(index) QxlVgaWritePortUint16(0x1ce, index);
+#define WRITE_PORT_VBE_DATA(data) QxlVgaWritePortUint16(0x1cf, data);
NTSTATUS BASIC_DISPLAY_DRIVER::SetSourceModeAndPath(CONST D3DKMDT_VIDPN_SOURCE_MODE* pSourceMode,
CONST D3DKMDT_VIDPN_PRESENT_PATH* pPath)