From c230d77bc22dc82ebd139b6da024b259c620a3d9 Mon Sep 17 00:00:00 2001 From: Stanislav Motylkov Date: Wed, 9 Oct 2019 02:06:58 +0300 Subject: [PATCH] nv2a: Add some missing RAMDAC registers Cromwell sets these registers on video initialization and guest OS should be able to read them in order to obtain current screen resolution set up by firmware. --- hw/xbox/nv2a/nv2a_int.h | 7 +++++++ hw/xbox/nv2a/nv2a_pramdac.c | 42 +++++++++++++++++++++++++++++++++++++ hw/xbox/nv2a/nv2a_regs.h | 7 +++++++ 3 files changed, 56 insertions(+) diff --git a/hw/xbox/nv2a/nv2a_int.h b/hw/xbox/nv2a/nv2a_int.h index 446d62ba46..cc104bc241 100644 --- a/hw/xbox/nv2a/nv2a_int.h +++ b/hw/xbox/nv2a/nv2a_int.h @@ -331,6 +331,13 @@ typedef struct NV2AState { uint32_t memory_clock_coeff; uint32_t video_clock_coeff; uint32_t general_control; + uint32_t fp_vdisplay_end; + uint32_t fp_vcrtc; + uint32_t fp_vsync_end; + uint32_t fp_vvalid_end; + uint32_t fp_hdisplay_end; + uint32_t fp_hcrtc; + uint32_t fp_hvalid_end; } pramdac; } NV2AState; diff --git a/hw/xbox/nv2a/nv2a_pramdac.c b/hw/xbox/nv2a/nv2a_pramdac.c index d7f7fd75e8..c8e2cd28a7 100644 --- a/hw/xbox/nv2a/nv2a_pramdac.c +++ b/hw/xbox/nv2a/nv2a_pramdac.c @@ -44,6 +44,27 @@ uint64_t pramdac_read(void *opaque, hwaddr addr, unsigned int size) case NV_PRAMDAC_GENERAL_CONTROL: r = d->pramdac.general_control; break; + case NV_PRAMDAC_FP_VDISPLAY_END: + r = d->pramdac.fp_vdisplay_end; + break; + case NV_PRAMDAC_FP_VCRTC: + r = d->pramdac.fp_vcrtc; + break; + case NV_PRAMDAC_FP_VSYNC_END: + r = d->pramdac.fp_vsync_end; + break; + case NV_PRAMDAC_FP_VVALID_END: + r = d->pramdac.fp_vvalid_end; + break; + case NV_PRAMDAC_FP_HDISPLAY_END: + r = d->pramdac.fp_hdisplay_end; + break; + case NV_PRAMDAC_FP_HCRTC: + r = d->pramdac.fp_hcrtc; + break; + case NV_PRAMDAC_FP_HVALID_END: + r = d->pramdac.fp_hvalid_end; + break; default: break; } @@ -87,6 +108,27 @@ void pramdac_write(void *opaque, hwaddr addr, uint64_t val, unsigned int size) case NV_PRAMDAC_GENERAL_CONTROL: d->pramdac.general_control = val; break; + case NV_PRAMDAC_FP_VDISPLAY_END: + d->pramdac.fp_vdisplay_end = val; + break; + case NV_PRAMDAC_FP_VCRTC: + d->pramdac.fp_vcrtc = val; + break; + case NV_PRAMDAC_FP_VSYNC_END: + d->pramdac.fp_vsync_end = val; + break; + case NV_PRAMDAC_FP_VVALID_END: + d->pramdac.fp_vvalid_end = val; + break; + case NV_PRAMDAC_FP_HDISPLAY_END: + d->pramdac.fp_hdisplay_end = val; + break; + case NV_PRAMDAC_FP_HCRTC: + d->pramdac.fp_hcrtc = val; + break; + case NV_PRAMDAC_FP_HVALID_END: + d->pramdac.fp_hvalid_end = val; + break; default: break; } diff --git a/hw/xbox/nv2a/nv2a_regs.h b/hw/xbox/nv2a/nv2a_regs.h index e27e43aa82..a689b14246 100644 --- a/hw/xbox/nv2a/nv2a_regs.h +++ b/hw/xbox/nv2a/nv2a_regs.h @@ -680,6 +680,13 @@ # define NV_PRAMDAC_PLL_TEST_COUNTER_VPLL_LOCK (1 << 31) #define NV_PRAMDAC_GENERAL_CONTROL 0x00000600 # define NV_PRAMDAC_GENERAL_CONTROL_ALT_MODE_SEL (1 << 12) +#define NV_PRAMDAC_FP_VDISPLAY_END 0x00000800 +#define NV_PRAMDAC_FP_VCRTC 0x00000808 +#define NV_PRAMDAC_FP_VSYNC_END 0x00000810 +#define NV_PRAMDAC_FP_VVALID_END 0x00000818 +#define NV_PRAMDAC_FP_HDISPLAY_END 0x00000820 +#define NV_PRAMDAC_FP_HCRTC 0x00000828 +#define NV_PRAMDAC_FP_HVALID_END 0x00000838 #define NV_USER_DMA_PUT 0x40 #define NV_USER_DMA_GET 0x44