-/* $OpenBSD: agp_machdep.c,v 1.14 2015/03/14 03:38:46 jsg Exp $ */
+/* $OpenBSD: agp_machdep.c,v 1.15 2024/07/02 04:10:25 jsg Exp $ */
/*
* Copyright (c) 2008 - 2009 Owain G. Ainsworth <oga@openbsd.org>
#include <sys/param.h>
#include <sys/systm.h>
-#include <sys/malloc.h>
-#include <sys/rwlock.h>
-
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-#include <dev/pci/pcidevs.h>
#include <uvm/uvm_extern.h>
#include <machine/cpufunc.h>
-#include <machine/bus.h>
#include <machine/pmap.h>
void
{
pmap_flush_cache(va, sz);
}
-
-struct agp_map {
- bus_space_tag_t bst;
- bus_space_handle_t bsh;
- bus_size_t size;
-};
-
-int
-agp_init_map(bus_space_tag_t tag, bus_addr_t address, bus_size_t size,
- int flags, struct agp_map **mapp)
-{
- struct agp_map *map;
- int err;
-
- map = malloc(sizeof(*map), M_AGP, M_WAITOK | M_CANFAIL);
- if (map == NULL)
- return (ENOMEM);
-
- map->bst = tag;
- map->size = size;
-
- if ((err = bus_space_map(tag, address, size, flags, &map->bsh)) != 0) {
- free(map, M_AGP, sizeof(*map));
- return (err);
- }
- *mapp = map;
- return (0);
-}
-
-void
-agp_destroy_map(struct agp_map *map)
-{
- bus_space_unmap(map->bst, map->bsh, map->size);
- free(map, M_AGP, sizeof(*map));
-}
-
-
-int
-agp_map_subregion(struct agp_map *map, bus_size_t offset, bus_size_t size,
- bus_space_handle_t *bshp)
-{
- return (bus_space_subregion(map->bst, map->bsh, offset, size, bshp));
-}
-
-void
-agp_unmap_subregion(struct agp_map *map, bus_space_handle_t bsh,
- bus_size_t size)
-{
- /* subregion doesn't need unmapping, do nothing */
-}
-
-void
-agp_map_atomic(struct agp_map *map, bus_size_t offset,
- bus_space_handle_t *bshp)
-{
- agp_map_subregion(map, offset, PAGE_SIZE, bshp);
-}
-
-void
-agp_unmap_atomic(struct agp_map *map, bus_space_handle_t bsh)
-{
- /* subregion doesn't need unmapping, do nothing */
-}
-/* $OpenBSD: agp_machdep.c,v 1.21 2023/01/30 10:49:05 jsg Exp $ */
+/* $OpenBSD: agp_machdep.c,v 1.22 2024/07/02 04:10:25 jsg Exp $ */
/*
* Copyright (c) 2008 - 2009 Owain G. Ainsworth <oga@openbsd.org>
#include <sys/param.h>
#include <sys/systm.h>
-#include <sys/malloc.h>
-
-#include <dev/pci/pcivar.h>
-#include <dev/pci/pcireg.h>
-#include <dev/pci/agpvar.h>
#include <uvm/uvm_extern.h>
#include <machine/cpufunc.h>
-#include <machine/bus.h>
#include <machine/pmap.h>
void
{
pmap_flush_cache(va, sz);
}
-
-struct agp_map {
- bus_space_tag_t bst;
- bus_addr_t addr;
- bus_size_t size;
- int flags;
- vaddr_t va;
-};
-
-extern struct extent *iomem_ex;
-
-int
-agp_init_map(bus_space_tag_t tag, bus_addr_t address, bus_size_t size,
- int flags, struct agp_map **mapp)
-{
- struct agp_map *map;
- int error;
-
- KASSERT(tag == I386_BUS_SPACE_MEM);
-
- /*
- * We grab the extent out of the bus region ourselves
- * so we don't need to do these allocations every time.
- */
- error = extent_alloc_region(iomem_ex, address, size,
- EX_NOWAIT | EX_MALLOCOK);
- if (error)
- return (error);
-
- map = malloc(sizeof(*map), M_AGP, M_WAITOK | M_CANFAIL);
- if (map == NULL)
- return (ENOMEM);
-
- map->bst = tag;
- map->addr = address;
- map->size = size;
- map->flags = flags;
-
- map->va = (vaddr_t)km_alloc(PAGE_SIZE, &kv_any, &kp_none, &kd_waitok);
- if (map->va == 0) {
- free(map, M_AGP, sizeof(*map));
- return (ENOMEM);
- }
-
- *mapp = map;
- return (0);
-}
-
-void
-agp_destroy_map(struct agp_map *map)
-{
- if (extent_free(iomem_ex, map->addr, map->size,
- EX_NOWAIT | EX_MALLOCOK ))
- printf("%s: can't free region\n",__func__);
- km_free((void *)map->va, PAGE_SIZE, &kv_any, &kp_none);
- free(map, M_AGP, sizeof(*map));
-}
-
-
-int
-agp_map_subregion(struct agp_map *map, bus_size_t offset, bus_size_t size,
- bus_space_handle_t *bshp)
-{
- return (_bus_space_map(map->bst, map->addr + offset, size,
- map->flags, bshp));
-}
-
-void
-agp_unmap_subregion(struct agp_map *map, bus_space_handle_t bsh,
- bus_size_t size)
-{
- return (_bus_space_unmap(map->bst, bsh, size, NULL));
-}
-
-void
-agp_map_atomic(struct agp_map *map, bus_size_t offset,
- bus_space_handle_t *bshp)
-{
- int pmap_flags = PMAP_NOCACHE;
- paddr_t pa;
-
- KASSERT((offset & PGOFSET) == 0);
-
- if (map->flags & BUS_SPACE_MAP_CACHEABLE)
- pmap_flags = 0;
- else if (map->flags & BUS_SPACE_MAP_PREFETCHABLE)
- pmap_flags = PMAP_WC;
-
- pa = bus_space_mmap(map->bst, map->addr, offset, 0, 0);
- pmap_kenter_pa(map->va, pa | pmap_flags, PROT_READ | PROT_WRITE);
- pmap_update(pmap_kernel());
-
- *bshp = (bus_space_handle_t)map->va;
-}
-
-void
-agp_unmap_atomic(struct agp_map *map, bus_space_handle_t bsh)
-{
- KASSERT(bsh == (bus_space_handle_t)map->va);
-
- pmap_kremove(map->va, PAGE_SIZE);
- pmap_update(pmap_kernel());
-}
-/* $OpenBSD: agpvar.h,v 1.35 2024/05/13 01:15:51 jsg Exp $ */
+/* $OpenBSD: agpvar.h,v 1.36 2024/07/02 04:10:25 jsg Exp $ */
/* $NetBSD: agpvar.h,v 1.4 2001/10/01 21:54:48 fvdl Exp $ */
/*-
size_t ag_size;
};
-struct agp_map;
-
/*
* Functions private to the AGP code.
*/
void agp_flush_cache(void);
void agp_flush_cache_range(vaddr_t, vsize_t);
int agp_generic_enable(struct agp_softc *, u_int32_t);
-int agp_init_map(bus_space_tag_t, bus_addr_t, bus_size_t, int, struct
- agp_map **);
-void agp_destroy_map(struct agp_map *);
-int agp_map_subregion(struct agp_map *, bus_size_t, bus_size_t,
- bus_space_handle_t *);
-void agp_unmap_subregion(struct agp_map *, bus_space_handle_t,
- bus_size_t);
-void agp_map_atomic(struct agp_map *, bus_size_t, bus_space_handle_t *);
-void agp_unmap_atomic(struct agp_map *, bus_space_handle_t);
int agp_alloc_dmamem(bus_dma_tag_t, size_t, bus_dmamap_t *,
bus_addr_t *, bus_dma_segment_t *);