changeset 3987:285470c0ea5c

PSARC/2007/196 gfx_private update to add devmap functions for Xen 6541692 gfx_private devmap support needed for Xen
author rugrat
date Fri, 06 Apr 2007 16:17:21 -0700
parents 8f772ca46fa3
children 2365e71eafb7
files usr/src/uts/i86pc/io/gfx_private/gfx_private.h usr/src/uts/i86pc/io/gfx_private/gfxp_devmap.c usr/src/uts/i86pc/io/gfx_private/gfxp_vm.c
diffstat 3 files changed, 69 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/usr/src/uts/i86pc/io/gfx_private/gfx_private.h	Fri Apr 06 15:57:19 2007 -0700
+++ b/usr/src/uts/i86pc/io/gfx_private/gfx_private.h	Fri Apr 06 16:17:21 2007 -0700
@@ -19,7 +19,7 @@
  * CDDL HEADER END
  */
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -37,6 +37,8 @@
 #define	GFXP_MEMORY_UNCACHED		1
 #define	GFXP_MEMORY_WRITECOMBINED	2
 
+typedef uint64_t gfx_maddr_t;
+
 extern int gfxp_ddi_segmap_setup(dev_t dev, off_t offset, struct as *as,
 	caddr_t *addrp, off_t len, uint_t prot, uint_t maxprot, uint_t flags,
 	cred_t *cred, ddi_device_acc_attr_t *accattrp, uint_t rnumber);
@@ -47,6 +49,9 @@
 	struct devmap_callback_ctl *callbackops, ddi_umem_cookie_t cookie,
 	offset_t off, size_t len, uint_t maxprot, uint_t flags,
 	ddi_device_acc_attr_t *accattrp);
+extern void gfxp_map_devmem(devmap_cookie_t dhc, gfx_maddr_t maddr,
+	size_t length, ddi_device_acc_attr_t *attrp);
+
 
 typedef char *gfxp_acc_handle_t;
 extern gfxp_acc_handle_t gfxp_pci_init_handle(uint8_t bus, uint8_t slot,
@@ -69,6 +74,7 @@
 extern int gfxp_va2pa(struct as *as, caddr_t addr, uint64_t *pa);
 extern void gfxp_fix_mem_cache_attrs(caddr_t kva_start, size_t length,
 	int cache_attr);
+extern gfx_maddr_t gfxp_convert_addr(paddr_t paddr);
 
 typedef char *gfxp_vgatext_softc_ptr_t;
 
--- a/usr/src/uts/i86pc/io/gfx_private/gfxp_devmap.c	Fri Apr 06 15:57:19 2007 -0700
+++ b/usr/src/uts/i86pc/io/gfx_private/gfxp_devmap.c	Fri Apr 06 16:17:21 2007 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -110,3 +110,57 @@
 	    l_flags, accattrp);
 	return (e);
 }
+
+/*
+ * Replacement for devmap_devmem_setup() which will map a machine address
+ * instead of a register set/offset.
+ */
+void
+gfxp_map_devmem(devmap_cookie_t dhc, gfx_maddr_t maddr, size_t length,
+    ddi_device_acc_attr_t *attrp)
+{
+	devmap_handle_t *dhp = (devmap_handle_t *)dhc;
+	pfn_t pfn;
+
+
+	pfn = mmu_btop(maddr);
+
+	dhp->dh_pfn = pfn;
+	dhp->dh_len = mmu_ptob(mmu_btopr(length));
+	dhp->dh_roff = 0;
+
+#ifndef DEVMAP_DEVMEM_COOKIE
+#define	DEVMAP_DEVMEM_COOKIE	((ddi_umem_cookie_t)0x1) /* XXPV */
+#endif /* DEVMAP_DEVMEM_COOKIE */
+	dhp->dh_cookie = DEVMAP_DEVMEM_COOKIE;
+	/*LINTED: E_EXPR_NULL_EFFECT*/
+	dhp->dh_flags |= DEVMAP_DEFAULTS;
+	dhp->dh_maxprot = PROT_ALL & dhp->dh_orig_maxprot;
+
+	/* no callbacks needed */
+	bzero(&dhp->dh_callbackops, sizeof (struct devmap_callback_ctl));
+
+	switch (attrp->devacc_attr_dataorder) {
+	case DDI_UNORDERED_OK_ACC:
+		dhp->dh_hat_attr = HAT_UNORDERED_OK;
+		break;
+	case DDI_MERGING_OK_ACC:
+		dhp->dh_hat_attr = HAT_MERGING_OK;
+		break;
+	case DDI_LOADCACHING_OK_ACC:
+		dhp->dh_hat_attr = HAT_LOADCACHING_OK;
+		break;
+	case DDI_STORECACHING_OK_ACC:
+		dhp->dh_hat_attr = HAT_STORECACHING_OK;
+		break;
+	case DDI_STRICTORDER_ACC:
+	default:
+		dhp->dh_hat_attr = HAT_STRICTORDER;
+	}
+
+	/* don't use large pages */
+	dhp->dh_mmulevel = 0;
+	dhp->dh_flags &= ~DEVMAP_FLAG_LARGE;
+
+	dhp->dh_flags |= DEVMAP_SETUP_DONE;
+}
--- a/usr/src/uts/i86pc/io/gfx_private/gfxp_vm.c	Fri Apr 06 15:57:19 2007 -0700
+++ b/usr/src/uts/i86pc/io/gfx_private/gfxp_vm.c	Fri Apr 06 16:17:21 2007 -0700
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
  * Use is subject to license terms.
  */
 
@@ -218,3 +218,9 @@
 
 	return (error);
 }
+
+gfx_maddr_t
+gfxp_convert_addr(paddr_t paddr)
+{
+	return ((gfx_maddr_t)paddr);
+}