diff options
author | Arnon Gilboa <agilboa@redhat.com> | 2013-06-02 16:46:53 +0300 |
---|---|---|
committer | Arnon Gilboa <agilboa@redhat.com> | 2013-06-02 16:46:53 +0300 |
commit | 76491e6af87079552aa5a5f5bdf7d77c6983bfdd (patch) | |
tree | cdefe438cbe126b0f7d3f600aa4b47609b2e67be | |
parent | b25dfe5e03fc09d9e6e6c9752e0b83433e17a4aa (diff) |
init ram & vram memslots
-rw-r--r-- | C++/bdd.cxx | 47 | ||||
-rw-r--r--[-rwxr-xr-x] | C++/bdd.hxx | 14 | ||||
-rw-r--r--[-rwxr-xr-x] | C++/bdd_ddi.cxx | 2 | ||||
-rw-r--r--[-rwxr-xr-x] | C++/bdd_dmm.cxx | 6 |
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)
|