#define pr_fmt(fmt) …
#include <linux/aperture.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/vmalloc.h>
#include <linux/init.h>
#include <linux/completion.h>
#include <linux/fb.h>
#include <linux/pci.h>
#include <linux/panic_notifier.h>
#include <linux/efi.h>
#include <linux/console.h>
#include <linux/hyperv.h>
#define MAX_VMBUS_PKT_SIZE …
#define SYNTHVID_VERSION(major, minor) …
#define SYNTHVID_VERSION_WIN7 …
#define SYNTHVID_VERSION_WIN8 …
#define SYNTHVID_VERSION_WIN10 …
#define SYNTHVID_VER_GET_MAJOR(ver) …
#define SYNTHVID_VER_GET_MINOR(ver) …
#define SYNTHVID_DEPTH_WIN8 …
#define SYNTHVID_FB_SIZE_WIN8 …
enum pipe_msg_type { … };
struct pipe_msg_hdr { … } __packed;
enum synthvid_msg_type { … };
#define SYNTHVID_EDID_BLOCK_SIZE …
#define SYNTHVID_MAX_RESOLUTION_COUNT …
struct hvd_screen_info { … } __packed;
struct synthvid_msg_hdr { … } __packed;
struct synthvid_version_req { … } __packed;
struct synthvid_version_resp { … } __packed;
struct synthvid_supported_resolution_req { … } __packed;
struct synthvid_supported_resolution_resp { … } __packed;
struct synthvid_vram_location { … } __packed;
struct synthvid_vram_location_ack { … } __packed;
struct video_output_situation { … } __packed;
struct synthvid_situation_update { … } __packed;
struct synthvid_situation_update_ack { … } __packed;
struct synthvid_pointer_position { … } __packed;
#define CURSOR_MAX_X …
#define CURSOR_MAX_Y …
#define CURSOR_ARGB_PIXEL_SIZE …
#define CURSOR_MAX_SIZE …
#define CURSOR_COMPLETE …
struct synthvid_pointer_shape { … } __packed;
struct synthvid_feature_change { … } __packed;
struct rect { … } __packed;
struct synthvid_dirt { … } __packed;
struct synthvid_msg { … } __packed;
#define HVFB_WIDTH …
#define HVFB_HEIGHT …
#define HVFB_WIDTH_MIN …
#define HVFB_HEIGHT_MIN …
#define RING_BUFSIZE …
#define VSP_TIMEOUT …
#define HVFB_UPDATE_DELAY …
#define HVFB_ONDEMAND_THROTTLE …
struct hvfb_par { … };
static uint screen_width = …;
static uint screen_height = …;
static uint screen_depth;
static uint screen_fb_size;
static uint dio_fb_size;
static inline int synthvid_send(struct hv_device *hdev,
struct synthvid_msg *msg)
{ … }
static int synthvid_send_situ(struct hv_device *hdev)
{ … }
static int synthvid_send_ptr(struct hv_device *hdev)
{ … }
static int
synthvid_update(struct fb_info *info, int x1, int y1, int x2, int y2)
{ … }
static void hvfb_docopy(struct hvfb_par *par,
unsigned long offset,
unsigned long size)
{ … }
static void synthvid_deferred_io(struct fb_info *p, struct list_head *pagereflist)
{ … }
static struct fb_deferred_io synthvid_defio = …;
static void synthvid_recv_sub(struct hv_device *hdev)
{ … }
static void synthvid_receive(void *ctx)
{ … }
static inline bool synthvid_ver_ge(u32 ver1, u32 ver2)
{ … }
static int synthvid_negotiate_ver(struct hv_device *hdev, u32 ver)
{ … }
static int synthvid_get_supported_resolution(struct hv_device *hdev)
{ … }
static int synthvid_connect_vsp(struct hv_device *hdev)
{ … }
static int synthvid_send_config(struct hv_device *hdev)
{ … }
static void hvfb_update_work(struct work_struct *w)
{ … }
static void hvfb_ondemand_refresh_throttle(struct hvfb_par *par,
int x1, int y1, int w, int h)
{ … }
static int hvfb_on_panic(struct notifier_block *nb,
unsigned long e, void *p)
{ … }
static int hvfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
{ … }
static int hvfb_set_par(struct fb_info *info)
{ … }
static inline u32 chan_to_field(u32 chan, struct fb_bitfield *bf)
{ … }
static int hvfb_setcolreg(unsigned regno, unsigned red, unsigned green,
unsigned blue, unsigned transp, struct fb_info *info)
{ … }
static int hvfb_blank(int blank, struct fb_info *info)
{ … }
static void hvfb_ops_damage_range(struct fb_info *info, off_t off, size_t len)
{ … }
static void hvfb_ops_damage_area(struct fb_info *info, u32 x, u32 y, u32 width, u32 height)
{ … }
FB_GEN_DEFAULT_DEFERRED_IOMEM_OPS(hvfb_ops,
hvfb_ops_damage_range,
hvfb_ops_damage_area)
static const struct fb_ops hvfb_ops = …;
static void hvfb_get_option(struct fb_info *info)
{ … }
static phys_addr_t hvfb_get_phymem(struct hv_device *hdev,
unsigned int request_size)
{ … }
static void hvfb_release_phymem(struct hv_device *hdev,
phys_addr_t paddr, unsigned int size)
{ … }
static int hvfb_getmem(struct hv_device *hdev, struct fb_info *info)
{ … }
static void hvfb_putmem(struct hv_device *hdev, struct fb_info *info)
{ … }
static int hvfb_probe(struct hv_device *hdev,
const struct hv_vmbus_device_id *dev_id)
{ … }
static void hvfb_remove(struct hv_device *hdev)
{ … }
static int hvfb_suspend(struct hv_device *hdev)
{ … }
static int hvfb_resume(struct hv_device *hdev)
{ … }
static const struct pci_device_id pci_stub_id_table[] = …;
static const struct hv_vmbus_device_id id_table[] = …;
MODULE_DEVICE_TABLE(pci, pci_stub_id_table);
MODULE_DEVICE_TABLE(vmbus, id_table);
static struct hv_driver hvfb_drv = …;
static int hvfb_pci_stub_probe(struct pci_dev *pdev,
const struct pci_device_id *ent)
{ … }
static void hvfb_pci_stub_remove(struct pci_dev *pdev)
{ … }
static struct pci_driver hvfb_pci_stub_driver = …;
static int __init hvfb_drv_init(void)
{ … }
static void __exit hvfb_drv_exit(void)
{ … }
module_init(…) …;
module_exit(hvfb_drv_exit);
MODULE_LICENSE(…) …;
MODULE_DESCRIPTION(…) …;