Mercurial > illumos > illumos-gate
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); +}