diff options
-rw-r--r-- | sys/arch/alpha/include/bus.h | 425 | ||||
-rw-r--r-- | sys/arch/i386/include/bus.h | 475 | ||||
-rw-r--r-- | sys/dev/ic/midway.c | 4 | ||||
-rw-r--r-- | sys/dev/ic/midwayreg.h | 4 |
4 files changed, 640 insertions, 268 deletions
diff --git a/sys/arch/alpha/include/bus.h b/sys/arch/alpha/include/bus.h index 75e7d3fe992..3ff76eb6ee1 100644 --- a/sys/arch/alpha/include/bus.h +++ b/sys/arch/alpha/include/bus.h @@ -1,5 +1,5 @@ -/* $OpenBSD: bus.h,v 1.3 1996/10/30 22:38:55 niklas Exp $ */ -/* $NetBSD: bus.h,v 1.4 1996/06/11 21:16:21 cgd Exp $ */ +/* $OpenBSD: bus.h,v 1.4 1996/11/12 22:46:26 niklas Exp $ */ +/* $NetBSD: bus.h,v 1.6 1996/10/22 21:23:49 cgd Exp $ */ /* * Copyright (c) 1996 Carnegie-Mellon University. @@ -29,191 +29,244 @@ */ #ifndef _ALPHA_BUS_H_ -#define _ALPHA_BUS_H_ - -/* - * I/O addresses (in bus space) - */ -typedef u_long bus_io_addr_t; -typedef u_long bus_io_size_t; - -/* - * Memory addresses (in bus space) - */ -typedef u_long bus_mem_addr_t; -typedef u_long bus_mem_size_t; - -/* - * Access methods for bus resources, I/O space, and memory space. - */ -typedef struct alpha_bus_chipset *bus_chipset_tag_t; -typedef u_long bus_io_handle_t; -typedef u_long bus_mem_handle_t; - -struct alpha_bus_chipset { - /* I/O-space cookie */ - void *bc_i_v; - - /* I/O-space control functions */ - int (*bc_i_map) __P((void *v, bus_io_addr_t port, - bus_io_size_t size, bus_io_handle_t *iohp)); - void (*bc_i_unmap) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t size)); - int (*bc_i_subregion) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t offset, bus_io_size_t size, - bus_io_handle_t *nioh)); - - /* I/O-space read functions */ - u_int8_t (*bc_ir1) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t off)); - u_int16_t (*bc_ir2) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t off)); - u_int32_t (*bc_ir4) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t off)); - u_int64_t (*bc_ir8) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t off)); - - /* I/O-space read-multiple functions */ - void (*bc_irm1) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t off, u_int8_t *addr, - bus_io_size_t count)); - void (*bc_irm2) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t off, u_int16_t *addr, - bus_io_size_t count)); - void (*bc_irm4) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t off, u_int32_t *addr, - bus_io_size_t count)); - void (*bc_irm8) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t off, u_int64_t *addr, - bus_io_size_t count)); - - /* I/O-space write functions */ - void (*bc_iw1) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t off, u_int8_t val)); - void (*bc_iw2) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t off, u_int16_t val)); - void (*bc_iw4) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t off, u_int32_t val)); - void (*bc_iw8) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t off, u_int64_t val)); - - /* I/O-space write-multiple functions */ - void (*bc_iwm1) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t off, const u_int8_t *addr, - bus_io_size_t count)); - void (*bc_iwm2) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t off, const u_int16_t *addr, - bus_io_size_t count)); - void (*bc_iwm4) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t off, const u_int32_t *addr, - bus_io_size_t count)); - void (*bc_iwm8) __P((void *v, bus_io_handle_t ioh, - bus_io_size_t off, const u_int64_t *addr, - bus_io_size_t count)); - - /* Mem-space cookie */ - void *bc_m_v; - - /* Mem-space control functions */ - int (*bc_m_map) __P((void *v, bus_mem_addr_t buspa, - bus_mem_size_t size, int cacheable, - bus_mem_handle_t *mhp)); - void (*bc_m_unmap) __P((void *v, bus_mem_handle_t mh, - bus_mem_size_t size)); - int (*bc_m_subregion) __P((void *v, bus_mem_handle_t memh, - bus_mem_size_t offset, bus_mem_size_t size, - bus_mem_handle_t *nmemh)); - - /* Mem-space read functions */ - u_int8_t (*bc_mr1) __P((void *v, bus_mem_handle_t memh, - bus_mem_size_t off)); - u_int16_t (*bc_mr2) __P((void *v, bus_mem_handle_t memh, - bus_mem_size_t off)); - u_int32_t (*bc_mr4) __P((void *v, bus_mem_handle_t memh, - bus_mem_size_t off)); - u_int64_t (*bc_mr8) __P((void *v, bus_mem_handle_t memh, - bus_mem_size_t off)); - - /* Mem-space write functions */ - void (*bc_mw1) __P((void *v, bus_mem_handle_t memh, - bus_mem_size_t off, u_int8_t val)); - void (*bc_mw2) __P((void *v, bus_mem_handle_t memh, - bus_mem_size_t off, u_int16_t val)); - void (*bc_mw4) __P((void *v, bus_mem_handle_t memh, - bus_mem_size_t off, u_int32_t val)); - void (*bc_mw8) __P((void *v, bus_mem_handle_t memh, - bus_mem_size_t off, u_int64_t val)); - - /* XXX THIS DOES NOT YET BELONG HERE */ - vm_offset_t (*bc_XXX_dmamap) __P((void *addr)); +#define _ALPHA_BUS_H_ + +/* + * Addresses (in bus space). + */ +typedef u_long bus_addr_t; +typedef u_long bus_size_t; + +/* + * Access methods for bus space. + */ +typedef struct alpha_bus_space *bus_space_tag_t; +typedef u_long bus_space_handle_t; + +struct alpha_bus_space { + /* cookie */ + void *abs_cookie; + + /* mapping/unmapping */ + int (*abs_map) __P((void *, bus_addr_t, bus_size_t, + int, bus_space_handle_t *)); + void (*abs_unmap) __P((void *, bus_space_handle_t, + bus_size_t)); + int (*abs_subregion) __P((void *, bus_space_handle_t, + bus_size_t, bus_size_t, bus_space_handle_t *)); + + /* allocation/deallocation */ + int (*abs_alloc) __P((void *, bus_addr_t, bus_addr_t, + bus_size_t, bus_size_t, bus_size_t, int, + bus_addr_t *, bus_space_handle_t *)); + void (*abs_free) __P((void *, bus_space_handle_t, + bus_size_t)); + + /* read (single) */ + u_int8_t (*abs_r_1) __P((void *, bus_space_handle_t, + bus_size_t)); + u_int16_t (*abs_r_2) __P((void *, bus_space_handle_t, + bus_size_t)); + u_int32_t (*abs_r_4) __P((void *, bus_space_handle_t, + bus_size_t)); + u_int64_t (*abs_r_8) __P((void *, bus_space_handle_t, + bus_size_t)); + + /* read multi */ + void (*abs_rm_1) __P((void *, bus_space_handle_t, + bus_size_t, u_int8_t *, bus_size_t)); + void (*abs_rm_2) __P((void *, bus_space_handle_t, + bus_size_t, u_int16_t *, bus_size_t)); + void (*abs_rm_4) __P((void *, bus_space_handle_t, + bus_size_t, u_int32_t *, bus_size_t)); + void (*abs_rm_8) __P((void *, bus_space_handle_t, + bus_size_t, u_int64_t *, bus_size_t)); + + /* read region */ + void (*abs_rr_1) __P((void *, bus_space_handle_t, + bus_size_t, u_int8_t *, bus_size_t)); + void (*abs_rr_2) __P((void *, bus_space_handle_t, + bus_size_t, u_int16_t *, bus_size_t)); + void (*abs_rr_4) __P((void *, bus_space_handle_t, + bus_size_t, u_int32_t *, bus_size_t)); + void (*abs_rr_8) __P((void *, bus_space_handle_t, + bus_size_t, u_int64_t *, bus_size_t)); + + /* write (single) */ + void (*abs_w_1) __P((void *, bus_space_handle_t, + bus_size_t, u_int8_t)); + void (*abs_w_2) __P((void *, bus_space_handle_t, + bus_size_t, u_int16_t)); + void (*abs_w_4) __P((void *, bus_space_handle_t, + bus_size_t, u_int32_t)); + void (*abs_w_8) __P((void *, bus_space_handle_t, + bus_size_t, u_int64_t)); + + /* write multi */ + void (*abs_wm_1) __P((void *, bus_space_handle_t, + bus_size_t, const u_int8_t *, bus_size_t)); + void (*abs_wm_2) __P((void *, bus_space_handle_t, + bus_size_t, const u_int16_t *, bus_size_t)); + void (*abs_wm_4) __P((void *, bus_space_handle_t, + bus_size_t, const u_int32_t *, bus_size_t)); + void (*abs_wm_8) __P((void *, bus_space_handle_t, + bus_size_t, const u_int64_t *, bus_size_t)); + + /* write region */ + void (*abs_wr_1) __P((void *, bus_space_handle_t, + bus_size_t, const u_int8_t *, bus_size_t)); + void (*abs_wr_2) __P((void *, bus_space_handle_t, + bus_size_t, const u_int16_t *, bus_size_t)); + void (*abs_wr_4) __P((void *, bus_space_handle_t, + bus_size_t, const u_int32_t *, bus_size_t)); + void (*abs_wr_8) __P((void *, bus_space_handle_t, + bus_size_t, const u_int64_t *, bus_size_t)); + + /* set multi */ + /* XXX IMPLEMENT */ + + /* set region */ + /* XXX IMPLEMENT */ + + /* copy */ + /* XXX IMPLEMENT */ + + /* barrier */ + void (*abs_barrier) __P((void *, bus_space_handle_t, + bus_size_t, bus_size_t, int)); }; -#define __bc_CONCAT(A,B) __CONCAT(A,B) -#define __bc_ABC(A,B,C) __bc_CONCAT(A,__bc_CONCAT(B,C)) -#define __bc_ABCD(A,B,C,D) __bc_CONCAT(__bc_ABC(A,B,C),D) - -#define __bc_rd(t, h, o, sz, sp) \ - (*(t)->__bc_ABCD(bc_,sp,r,sz))((t)->__bc_ABC(bc_,sp,_v), h, o) - -#define __bc_wr(t, h, o, v, sz, sp) \ - (*(t)->__bc_ABCD(bc_,sp,w,sz))((t)->__bc_ABC(bc_,sp,_v), h, o, v) - -#define bus_io_map(t, port, size, iohp) \ - (*(t)->bc_i_map)((t)->bc_i_v, (port), (size), (iohp)) -#define bus_io_unmap(t, ioh, size) \ - (*(t)->bc_i_unmap)((t)->bc_i_v, (ioh), (size)) -#define bus_io_subregion(t, ioh, offset, size, nioh) \ - (*(t)->bc_i_unmap)((t)->bc_i_v, (ioh), (offset), (size), (nioh)) - -#define __bc_io_multi(t, h, o, a, s, dir, sz) \ - (*(t)->__bc_ABCD(bc_i,dir,m,sz))((t)->bc_i_v, h, o, a, s) - -#define bus_io_read_1(t, h, o) __bc_rd((t),(h),(o),1,i) -#define bus_io_read_2(t, h, o) __bc_rd((t),(h),(o),2,i) -#define bus_io_read_4(t, h, o) __bc_rd((t),(h),(o),4,i) -#define bus_io_read_8(t, h, o) __bc_rd((t),(h),(o),8,i) - -#define bus_io_read_multi_1(t, h, o, a, s) \ - __bc_io_multi((t),(h),(o),(a),(s),r,1) -#define bus_io_read_multi_2(t, h, o, a, s) \ - __bc_io_multi((t),(h),(o),(a),(s),r,2) -#define bus_io_read_multi_4(t, h, o, a, s) \ - __bc_io_multi((t),(h),(o),(a),(s),r,4) -#define bus_io_read_multi_8(t, h, o, a, s) \ - __bc_io_multi((t),(h),(o),(a),(s),r,8) - -#define bus_io_write_1(t, h, o, v) __bc_wr((t),(h),(o),(v),1,i) -#define bus_io_write_2(t, h, o, v) __bc_wr((t),(h),(o),(v),2,i) -#define bus_io_write_4(t, h, o, v) __bc_wr((t),(h),(o),(v),4,i) -#define bus_io_write_8(t, h, o, v) __bc_wr((t),(h),(o),(v),8,i) - -#define bus_io_write_multi_1(t, h, o, a, s) \ - __bc_io_multi((t),(h),(o),(a),(s),w,1) -#define bus_io_write_multi_2(t, h, o, a, s) \ - __bc_io_multi((t),(h),(o),(a),(s),w,2) -#define bus_io_write_multi_4(t, h, o, a, s) \ - __bc_io_multi((t),(h),(o),(a),(s),w,4) -#define bus_io_write_multi_8(t, h, o, a, s) \ - __bc_io_multi((t),(h),(o),(a),(s),w,8) - -#define bus_mem_map(t, bpa, size, cacheable, mhp) \ - (*(t)->bc_m_map)((t)->bc_m_v, (bpa), (size), (cacheable), (mhp)) -#define bus_mem_unmap(t, memh, size) \ - (*(t)->bc_m_unmap)((t)->bc_m_v, (memh), (size)) -#define bus_mem_subregion(t, memh, offset, size, nmemh) \ - (*(t)->bc_m_unmap)((t)->bc_i_v, (memh), (offset), (size), (nmemh)) - -#define bus_mem_read_1(t, h, o) __bc_rd((t),(h),(o),1,m) -#define bus_mem_read_2(t, h, o) __bc_rd((t),(h),(o),2,m) -#define bus_mem_read_4(t, h, o) __bc_rd((t),(h),(o),4,m) -#define bus_mem_read_8(t, h, o) __bc_rd((t),(h),(o),8,m) - -#define bus_mem_write_1(t, h, o, v) __bc_wr((t),(h),(o),(v),1,m) -#define bus_mem_write_2(t, h, o, v) __bc_wr((t),(h),(o),(v),2,m) -#define bus_mem_write_4(t, h, o, v) __bc_wr((t),(h),(o),(v),4,m) -#define bus_mem_write_8(t, h, o, v) __bc_wr((t),(h),(o),(v),8,m) - -/* XXX THIS DOES NOT BELONG HERE YET. */ -#define __alpha_bus_XXX_dmamap(t, va) (*(t)->bc_XXX_dmamap)((va)) + +/* + * Utility macros; INTERNAL USE ONLY. + */ +#define __abs_c(a,b) __CONCAT(a,b) +#define __abs_opname(op,size) __abs_c(__abs_c(__abs_c(abs_,op),_),size) + +#define __abs_rs(sz, t, h, o) \ + (*(t)->__abs_opname(r,sz))((t)->abs_cookie, h, o) +#define __abs_ws(sz, t, h, o, v) \ + (*(t)->__abs_opname(w,sz))((t)->abs_cookie, h, o, v) +#define __abs_nonsingle(type, sz, t, h, o, a, c) \ + (*(t)->__abs_opname(type,sz))((t)->abs_cookie, h, o, a, c) + + +/* + * Mapping and unmapping operations. + */ +#define bus_space_map(t, a, s, c, hp) \ + (*(t)->abs_map)((t)->abs_cookie, (a), (s), (c), (hp)) +#define bus_space_unmap(t, h, s) \ + (*(t)->abs_unmap)((t)->abs_cookie, (h), (s)) +#define bus_space_subregion(t, h, o, s, hp) \ + (*(t)->abs_subregion)((t)->abs_cookie, (h), (o), (s), (hp)) + + +/* + * Allocation and deallocation operations. + */ +#define bus_space_alloc(t, rs, re, s, a, b, c, ap, hp) \ + (*(t)->abs_alloc)((t)->abs_cookie, (rs), (re), (s), (a), (b), \ + (c), (ap), (hp)) +#define bus_space_free(t, h, s) \ + (*(t)->abs_free)((t)->abs_cookie, (h), (s)) + + +/* + * Bus read (single) operations. + */ +#define bus_space_read_1(t, h, o) __abs_rs(1,(t),(h),(o)) +#define bus_space_read_2(t, h, o) __abs_rs(2,(t),(h),(o)) +#define bus_space_read_4(t, h, o) __abs_rs(4,(t),(h),(o)) +#define bus_space_read_8(t, h, o) __abs_rs(8,(t),(h),(o)) + + +/* + * Bus read multiple operations. + */ +#define bus_space_read_multi_1(t, h, o, a, c) \ + __abs_nonsingle(rm,1,(t),(h),(o),(a),(c)) +#define bus_space_read_multi_2(t, h, o, a, c) \ + __abs_nonsingle(rm,2,(t),(h),(o),(a),(c)) +#define bus_space_read_multi_4(t, h, o, a, c) \ + __abs_nonsingle(rm,4,(t),(h),(o),(a),(c)) +#define bus_space_read_multi_8(t, h, o, a, c) \ + __abs_nonsingle(rm,8,(t),(h),(o),(a),(c)) + + +/* + * Bus read region operations. + */ +#define bus_space_read_region_1(t, h, o, a, c) \ + __abs_nonsingle(rr,1,(t),(h),(o),(a),(c)) +#define bus_space_read_region_2(t, h, o, a, c) \ + __abs_nonsingle(rr,2,(t),(h),(o),(a),(c)) +#define bus_space_read_region_4(t, h, o, a, c) \ + __abs_nonsingle(rr,4,(t),(h),(o),(a),(c)) +#define bus_space_read_region_8(t, h, o, a, c) \ + __abs_nonsingle(rr,8,(t),(h),(o),(a),(c)) + + +/* + * Bus write (single) operations. + */ +#define bus_space_write_1(t, h, o, v) __abs_ws(1,(t),(h),(o),(v)) +#define bus_space_write_2(t, h, o, v) __abs_ws(2,(t),(h),(o),(v)) +#define bus_space_write_4(t, h, o, v) __abs_ws(4,(t),(h),(o),(v)) +#define bus_space_write_8(t, h, o, v) __abs_ws(8,(t),(h),(o),(v)) + + +/* + * Bus write multiple operations. + */ +#define bus_space_write_multi_1(t, h, o, a, c) \ + __abs_nonsingle(wm,1,(t),(h),(o),(a),(c)) +#define bus_space_write_multi_2(t, h, o, a, c) \ + __abs_nonsingle(wm,2,(t),(h),(o),(a),(c)) +#define bus_space_write_multi_4(t, h, o, a, c) \ + __abs_nonsingle(wm,4,(t),(h),(o),(a),(c)) +#define bus_space_write_multi_8(t, h, o, a, c) \ + __abs_nonsingle(wm,8,(t),(h),(o),(a),(c)) + + +/* + * Bus write region operations. + */ +#define bus_space_write_region_1(t, h, o, a, c) \ + __abs_nonsingle(wr,1,(t),(h),(o),(a),(c)) +#define bus_space_write_region_2(t, h, o, a, c) \ + __abs_nonsingle(wr,2,(t),(h),(o),(a),(c)) +#define bus_space_write_region_4(t, h, o, a, c) \ + __abs_nonsingle(wr,4,(t),(h),(o),(a),(c)) +#define bus_space_write_region_8(t, h, o, a, c) \ + __abs_nonsingle(wr,8,(t),(h),(o),(a),(c)) + + +/* + * Set multiple operations. + */ +/* XXX IMPLEMENT */ + + +/* + * Set region operations. + */ +/* XXX IMPLEMENT */ + + +/* + * Copy operations. + */ +/* XXX IMPLEMENT */ + + +/* + * Bus barrier operations. + */ +#define bus_space_barrier(t, h, o, l, f) \ + (*(t)->abs_barrier)((t)->abs_cookie, (h), (o), (l), (f)) + +#define BUS_BARRIER_READ 0x01 +#define BUS_BARRIER_WRITE 0x02 #endif /* _ALPHA_BUS_H_ */ diff --git a/sys/arch/i386/include/bus.h b/sys/arch/i386/include/bus.h index b5cfac6e3cb..17cbbcc784c 100644 --- a/sys/arch/i386/include/bus.h +++ b/sys/arch/i386/include/bus.h @@ -1,7 +1,9 @@ -/* $OpenBSD: bus.h,v 1.5 1996/07/31 01:45:53 niklas Exp $ */ -/* $NetBSD: bus.h,v 1.3 1996/05/03 19:22:18 christos Exp $ */ +/* $OpenBSD: bus.h,v 1.6 1996/11/12 22:46:27 niklas Exp $ */ +/* $NetBSD: bus.h,v 1.5 1996/10/21 22:26:19 thorpej Exp $ */ /* + * Copyright (c) 1996 Charles M. Hannum. All rights reserved. + * Copyright (c) 1996 Jason R. Thorpe. All rights reserved. * Copyright (c) 1996 Christopher G. Demetriou. All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,99 +39,416 @@ #include <machine/pio.h> /* - * I/O addresses (in bus space) + * Values for the i386 bus space tag, not to be used directly by MI code. */ -typedef u_long bus_io_addr_t; -typedef u_long bus_io_size_t; +#define I386_BUS_SPACE_IO 0 /* space is i/o space */ +#define I386_BUS_SPACE_MEM 1 /* space is mem space */ /* - * Memory addresses (in bus space) + * Bus address and size types */ -typedef u_long bus_mem_addr_t; -typedef u_long bus_mem_size_t; +typedef u_long bus_addr_t; +typedef u_long bus_size_t; /* - * Access methods for bus resources, I/O space, and memory space. + * Access methods for bus resources and address space. */ -typedef void *bus_chipset_tag_t; -typedef u_long bus_io_handle_t; -typedef caddr_t bus_mem_handle_t; - -#define bus_io_map(t, port, size, iohp) \ - ((void) t, *iohp = port, 0) -#define bus_io_unmap(t, ioh, size) - -#define bus_io_read_1(t, h, o) ((void) t, inb((h) + (o))) -#define bus_io_read_2(t, h, o) ((void) t, inw((h) + (o))) -#define bus_io_read_4(t, h, o) ((void) t, inl((h) + (o))) -#if 0 /* Cause a link error for bus_io_read_8 */ -#define bus_io_read_8(t, h, o) !!! bus_io_read_8 unimplemented !!! +typedef int bus_space_tag_t; +typedef u_long bus_space_handle_t; + +int bus_space_map __P((bus_space_tag_t t, bus_addr_t addr, + bus_size_t size, int cacheable, bus_space_handle_t *bshp)); +void bus_space_unmap __P((bus_space_tag_t t, bus_space_handle_t bsh, + bus_size_t size)); +int bus_space_subregion __P((bus_space_tag_t t, bus_space_handle_t bsh, + bus_size_t offset, bus_size_t size, bus_space_handle_t *nbshp)); + +int bus_space_alloc __P((bus_space_tag_t t, bus_addr_t rstart, + bus_addr_t rend, bus_size_t size, bus_size_t align, + bus_addr_t boundary, int cacheable, bus_addr_t *addrp, + bus_space_handle_t *bshp)); +void bus_space_free __P((bus_space_tag_t t, bus_space_handle_t bsh, + bus_size_t size)); + +/* + * u_intN_t bus_space_read_N __P((bus_space_tag_t tag, + * bus_space_handle_t bsh, bus_size_t offset)); + * + * Read a 1, 2, 4, or 8 byte quantity from bus space + * described by tag/handle/offset. + */ + +#define bus_space_read_1(t, h, o) \ + ((t) == I386_BUS_SPACE_IO ? (inb((h) + (o))) : \ + (*(volatile u_int8_t *)((h) + (o)))) + +#define bus_space_read_2(t, h, o) \ + ((t) == I386_BUS_SPACE_IO ? (inw((h) + (o))) : \ + (*(volatile u_int16_t *)((h) + (o)))) + +#define bus_space_read_4(t, h, o) \ + ((t) == I386_BUS_SPACE_IO ? (inl((h) + (o))) : \ + (*(volatile u_int32_t *)((h) + (o)))) + +#if 0 /* Cause a link error for bus_space_read_8 */ +#define bus_space_read_8(t, h, o) !!! bus_space_read_8 unimplemented !!! #endif -#define bus_io_read_multi_1(t, h, o, a, c) \ - ((void) t, insb((h) + (o), (a), (c))) -#define bus_io_read_multi_2(t, h, o, a, c) \ - ((void) t, insw((h) + (o), (a), (c))) -#define bus_io_read_multi_4(t, h, o, a, c) \ - ((void) t, insl((h) + (o), (a), (c))) -#if 0 /* Cause a link error for bus_io_read_multi_8 */ -#define bus_io_read_multi_8(t, h, o, a, c) \ - !!! bus_io_read_multi_8 unimplemented !!! +/* + * void bus_space_read_multi_N __P((bus_space_tag_t tag, + * bus_space_handle_t bsh, bus_size_t offset, + * u_intN_t *addr, size_t count)); + * + * Read `count' 1, 2, 4, or 8 byte quantities from bus space + * described by tag/handle/offset and copy into buffer provided. + */ + +#define bus_space_read_multi_1(t, h, o, a, c) do { \ + if ((t) == I386_BUS_SPACE_IO) { \ + insb((h) + (o), (a), (c)); \ + } else { \ + __asm __volatile(" \ + cld ; \ + 1: movb (%0),%%al ; \ + stosb ; \ + loop 1b" : \ + : \ + "r" ((h) + (o)), "D" ((a)), "c" ((c)) : \ + "%edi", "%ecx", "%eax", "memory"); \ + } \ +} while (0) + +#define bus_space_read_multi_2(t, h, o, a, c) do { \ + if ((t) == I386_BUS_SPACE_IO) { \ + insw((h) + (o), (a), (c)); \ + } else { \ + __asm __volatile(" \ + cld ; \ + 1: movw (%0),%%ax ; \ + stosw ; \ + loop 1b" : \ + : \ + "r" ((h) + (o)), "D" ((a)), "c" ((c)) : \ + "%edi", "%ecx", "%eax", "memory"); \ + } \ +} while (0) + +#define bus_space_read_multi_4(t, h, o, a, c) do { \ + if ((t) == I386_BUS_SPACE_IO) { \ + insl((h) + (o), (a), (c)); \ + } else { \ + __asm __volatile(" \ + cld ; \ + 1: movl (%0),%%eax ; \ + stosl ; \ + loop 1b" : \ + : \ + "r" ((h) + (o)), "D" ((a)), "c" ((c)) : \ + "%edi", "%ecx", "%eax", "memory"); \ + } \ +} while (0) + +#if 0 /* Cause a link error for bus_space_read_multi_8 */ +#define bus_space_read_multi_8 !!! bus_space_read_multi_8 unimplemented !!! #endif -#define bus_io_write_1(t, h, o, v) ((void) t, outb((h) + (o), (v))) -#define bus_io_write_2(t, h, o, v) ((void) t, outw((h) + (o), (v))) -#define bus_io_write_4(t, h, o, v) ((void) t, outl((h) + (o), (v))) -#if 0 /* Cause a link error for bus_io_write_8 */ -#define bus_io_write_8(t, h, o, v) !!! bus_io_write_8 unimplemented !!! +/* + * void bus_space_read_region_N __P((bus_space_tag_t tag, + * bus_space_handle_t bsh, bus_size_t offset, + * u_intN_t *addr, size_t count)); + * + * Read `count' 1, 2, 4, or 8 byte quantities from bus space + * described by tag/handle and starting at `offset' and copy into + * buffer provided. + */ + +#define bus_space_read_region_1(t, h, o, a, c) do { \ + if ((t) == I386_BUS_SPACE_IO) { \ + __asm __volatile(" \ + cld ; \ + 1: inb %w0,%%al ; \ + stosb ; \ + incl %0 ; \ + loop 1b" : \ + : \ + "d" ((h) + (o)), "D" ((a)), "c" ((c)) : \ + "%edx", "%edi", "%ecx", "%eax", "memory"); \ + } else { \ + __asm __volatile(" \ + cld ; \ + repne ; \ + movsb" : \ + : \ + "S" ((h) + (o)), "D" ((a)), "c" ((c)) : \ + "%esi", "%edi", "%ecx", "memory"); \ + } \ +} while (0) + +#define bus_space_read_region_2(t, h, o, a, c) do { \ + if ((t) == I386_BUS_SPACE_IO) { \ + __asm __volatile(" \ + cld ; \ + 1: inw %w0,%%ax ; \ + stosw ; \ + addl $2,%0 ; \ + loop 1b" : \ + : \ + "d" ((h) + (o)), "D" ((a)), "c" ((c)) : \ + "%edx", "%edi", "%ecx", "%eax", "memory"); \ + } else { \ + __asm __volatile(" \ + cld ; \ + repne ; \ + movsw" : \ + : \ + "S" ((h) + (o)), "D" ((a)), "c" ((c)) : \ + "%esi", "%edi", "%ecx", "memory"); \ + } \ +} while (0) + +#define bus_space_read_region_4(t, h, o, a, c) do { \ + if ((t) == I386_BUS_SPACE_IO) { \ + __asm __volatile(" \ + cld ; \ + 1: inl %w0,%%eax ; \ + stosl ; \ + addl $4,%0 ; \ + loop 1b" : \ + : \ + "d" ((h) + (o)), "D" ((a)), "c" ((c)) : \ + "%edx", "%edi", "%ecx", "%eax", "memory"); \ + } else { \ + __asm __volatile(" \ + cld ; \ + repne ; \ + movsl" : \ + : \ + "S" ((h) + (o)), "D" ((a)), "c" ((c)) : \ + "%esi", "%edi", "%ecx", "memory"); \ + } \ +} while (0) + +#if 0 /* Cause a link error for bus_space_read_region_8 */ +#define bus_space_read_region_8 !!! bus_space_read_region_8 unimplemented !!! #endif -#define bus_io_write_multi_1(t, h, o, a, c) \ - ((void) t, outsb((h) + (o), (a), (c))) -#define bus_io_write_multi_2(t, h, o, a, c) \ - ((void) t, outsw((h) + (o), (a), (c))) -#define bus_io_write_multi_4(t, h, o, a, c) \ - ((void) t, outsl((h) + (o), (a), (c))) -#if 0 /* Cause a link error for bus_io_write_multi_8 */ -#define bus_io_write_multi_8(t, h, o, a, c) \ - !!! bus_io_write_multi_8 unimplimented !!! +/* + * void bus_space_write_N __P((bus_space_tag_t tag, + * bus_space_handle_t bsh, bus_size_t offset, + * u_intN_t value)); + * + * Write the 1, 2, 4, or 8 byte value `value' to bus space + * described by tag/handle/offset. + */ + +#define bus_space_write_1(t, h, o, v) do { \ + if ((t) == I386_BUS_SPACE_IO) \ + outb((h) + (o), (v)); \ + else \ + ((void)(*(volatile u_int8_t *)((h) + (o)) = (v))); \ +} while (0) + +#define bus_space_write_2(t, h, o, v) do { \ + if ((t) == I386_BUS_SPACE_IO) \ + outw((h) + (o), (v)); \ + else \ + ((void)(*(volatile u_int16_t *)((h) + (o)) = (v))); \ +} while (0) + +#define bus_space_write_4(t, h, o, v) do { \ + if ((t) == I386_BUS_SPACE_IO) \ + outl((h) + (o), (v)); \ + else \ + ((void)(*(volatile u_int32_t *)((h) + (o)) = (v))); \ +} while (0) + +#if 0 /* Cause a link error for bus_space_write_8 */ +#define bus_space_write_8 !!! bus_space_write_8 not implemented !!! #endif -int bus_mem_map __P((bus_chipset_tag_t t, bus_mem_addr_t bpa, - bus_mem_size_t size, int cacheable, bus_mem_handle_t *mhp)); -void bus_mem_unmap __P((bus_chipset_tag_t t, bus_mem_handle_t memh, - bus_mem_size_t size)); - -#define bus_mem_read_1(t, h, o) ((void) t, (*(volatile u_int8_t *)((h) + (o)))) -#define bus_mem_read_2(t, h, o) ((void) t, (*(volatile u_int16_t *)((h) + (o)))) -#define bus_mem_read_4(t, h, o) ((void) t, (*(volatile u_int32_t *)((h) + (o)))) -#define bus_mem_read_8(t, h, o) ((void) t, (*(volatile u_int64_t *)((h) + (o)))) - -#define bus_mem_write_1(t, h, o, v) \ - ((void) t, ((void)(*(volatile u_int8_t *)((h) + (o)) = (v)))) -#define bus_mem_write_2(t, h, o, v) \ - ((void) t, ((void)(*(volatile u_int16_t *)((h) + (o)) = (v)))) -#define bus_mem_write_4(t, h, o, v) \ - ((void) t, ((void)(*(volatile u_int32_t *)((h) + (o)) = (v)))) -#define bus_mem_write_8(t, h, o, v) \ - ((void) t, ((void)(*(volatile u_int64_t *)((h) + (o)) = (v)))) - -#define bus_io_read_raw_multi_2(t, h, o, a, c) \ - ((void) t, insw((h) + (o), (a), (c) >> 1)) -#define bus_io_read_raw_multi_4(t, h, o, a, c) \ - ((void) t, insl((h) + (o), (a), (c) >> 2)) -#if 0 /* Cause a link error for bus_io_read_raw_multi_8 */ -#define bus_io_read_raw_multi_8(t, h, o, a, c) \ - !!! bus_io_read_multi_8 unimplemented !!! +/* + * void bus_space_write_multi_N __P((bus_space_tag_t tag, + * bus_space_handle_t bsh, bus_size_t offset, + * u_intN_t *addr, size_t count)); + * + * Write `count' 1, 2, 4, or 8 byte quantities from the buffer + * provided to bus space described by tag/handle/offset. + */ + +#define bus_space_write_multi_1(t, h, o, a, c) do { \ + if ((t) == I386_BUS_SPACE_IO) { \ + outsb((h) + (o), (a), (c)); \ + } else { \ + __asm __volatile(" \ + cld ; \ + 1: lodsb ; \ + movb %%al,(%0) ; \ + loop 1b" : \ + : \ + "r" ((h) + (o)), "S" ((a)), "c" ((c)) : \ + "%esi", "%ecx", "%eax"); \ + } \ +} while (0) + +#define bus_space_write_multi_2(t, h, o, a, c) do { \ + if ((t) == I386_BUS_SPACE_IO) { \ + outsw((h) + (o), (a), (c)); \ + } else { \ + __asm __volatile(" \ + cld ; \ + 1: lodsw ; \ + movw %%ax,(%0) ; \ + loop 1b" : \ + : \ + "r" ((h) + (o)), "S" ((a)), "c" ((c)) : \ + "%esi", "%ecx", "%eax"); \ + } \ +} while (0) + +#define bus_space_write_multi_4(t, h, o, a, c) do { \ + if ((t) == I386_BUS_SPACE_IO) { \ + outsl((h) + (o), (a), (c)); \ + } else { \ + __asm __volatile(" \ + cld ; \ + 1: lodsl ; \ + movl %%eax,(%0) ; \ + loop 1b" : \ + : \ + "r" ((h) + (o)), "S" ((a)), "c" ((c)) : \ + "%esi", "%ecx", "%eax"); \ + } \ +} while (0) + +#if 0 /* Cause a link error for bus_space_write_multi_8 */ +#define bus_space_write_multi_8(t, h, o, a, c) \ + !!! bus_space_write_multi_8 unimplimented !!! #endif -#define bus_io_write_raw_multi_2(t, h, o, a, c) \ - ((void) t, outsw((h) + (o), (a), (c) >> 1)) -#define bus_io_write_raw_multi_4(t, h, o, a, c) \ - ((void) t, outsl((h) + (o), (a), (c) >> 2)) -#if 0 /* Cause a link error for bus_io_write_raw_multi_8 */ -#define bus_io_write_raw_multi_8(t, h, o, a, c) \ - !!! bus_io_write_multi_8 unimplimented !!! +/* + * void bus_space_write_region_N __P((bus_space_tag_t tag, + * bus_space_handle_t bsh, bus_size_t offset, + * u_intN_t *addr, size_t count)); + * + * Write `count' 1, 2, 4, or 8 byte quantities from the buffer provided + * to bus space described by tag/handle starting at `offset'. + */ + +#define bus_space_write_region_1(t, h, o, a, c) do { \ + if ((t) == I386_BUS_SPACE_IO) { \ + __asm __volatile(" \ + cld ; \ + 1: lodsb ; \ + outb %%al,%w0 ; \ + incl %0 ; \ + loop 1b" : \ + : \ + "d" ((h) + (o)), "S" ((a)), "c" ((c)) : \ + "%edx", "%esi", "%ecx", "%eax", "memory"); \ + } else { \ + __asm __volatile(" \ + cld ; \ + repne ; \ + movsb" : \ + : \ + "D" ((h) + (o)), "S" ((a)), "c" ((c)) : \ + "%edi", "%esi", "%ecx", "memory"); \ + } \ +} while (0) + +#define bus_space_write_region_2(t, h, o, a, c) do { \ + if ((t) == I386_BUS_SPACE_IO) { \ + __asm __volatile(" \ + cld ; \ + 1: lodsw ; \ + outw %%ax,%w0 ; \ + addl $2,%0 ; \ + loop 1b" : \ + : \ + "d" ((h) + (o)), "S" ((a)), "c" ((c)) : \ + "%edx", "%esi", "%ecx", "%eax", "memory"); \ + } else { \ + __asm __volatile(" \ + cld ; \ + repne ; \ + movsw" : \ + : \ + "D" ((h) + (o)), "S" ((a)), "c" ((c)) : \ + "%edi", "%esi", "%ecx", "memory"); \ + } \ +} while (0) + +#define bus_space_write_region_4(t, h, o, a, c) do { \ + if ((t) == I386_BUS_SPACE_IO) { \ + __asm __volatile(" \ + cld ; \ + 1: lodsl ; \ + outl %%eax,%w0 ; \ + addl $4,%0 ; \ + loop 1b" : \ + : \ + "d" ((h) + (o)), "S" ((a)), "c" ((c)) : \ + "%edx", "%esi", "%ecx", "%eax", "memory"); \ + } else { \ + __asm __volatile(" \ + cld ; \ + repne ; \ + movsl" : \ + : \ + "D" ((h) + (o)), "S" ((a)), "c" ((c)) : \ + "%edi", "%esi", "%ecx", "memory"); \ + } \ +} while (0) + +#if 0 /* Cause a link error for bus_space_write_region_8 */ +#define bus_space_write_region_8 \ + !!! bus_space_write_region_8 unimplemented !!! #endif +/* + * void bus_space_set_multi_N __P((bus_space_tag_t tag, + * bus_space_handle_t bsh, u_intN_t val, size_t count)); + * + * Write the 1, 2, 4, or 8 byte value `val' to bus space described + * by tag/handle/offset `count' times. + */ + + /* XXX IMPLEMENT bus_space_set_multi_N() XXX */ + +/* + * void bus_space_set_region_N __P((bus_space_tag_t tag, + * bus_space_handle_t bsh, u_intN_t val, size_t count)); + * + * Write `count' 1, 2, 4, or 8 byte value `val' to bus space described + * by tag/handle starting at `offset'. + */ + + /* XXX IMPLEMENT bus_space_set_region_N() XXX */ + +/* + * void bus_space_copy_N __P((bus_space_tag_t tag, + * bus_space_handle_t bsh1, bus_size_t off1, + * bus_space_handle_t bsh2, bus_size_t off2, + * size_t count)); + * + * Copy `count' 1, 2, 4, or 8 byte values from bus space starting + * at tag/bsh1/off1 to bus space starting at tag/bsh2/off2. + */ + + /* XXX IMPLEMENT bus_space_copy_N() XXX */ + +/* + * Bus read/write barrier methods. + * + * void bus_space_barrier __P((bus_space_tag_t tag, + * bus_space_handle_t bsh, bus_size_t offset, + * bus_size_t len, int flags)); + * + * Note: the i386 does not currently require barriers, but we must + * provide the flags to MI code. + */ +#define bus_space_barrier(t, h, o, l, f) +#define BUS_BARRIER_READ 0x01 /* force read barrier */ +#define BUS_BARRIER_WRITE 0x02 /* force write barrier */ + #endif /* _I386_BUS_H_ */ diff --git a/sys/dev/ic/midway.c b/sys/dev/ic/midway.c index 61fe659c81a..a8e3ca18d87 100644 --- a/sys/dev/ic/midway.c +++ b/sys/dev/ic/midway.c @@ -1,4 +1,4 @@ -/* $OpenBSD: midway.c,v 1.15 1996/11/12 20:30:20 niklas Exp $ */ +/* $OpenBSD: midway.c,v 1.16 1996/11/12 22:46:23 niklas Exp $ */ /* (sync'd to midway.c 1.63) */ /* @@ -114,7 +114,7 @@ #if !defined(sparc) && !defined(__FreeBSD__) -#include <machine/bus.old.h> +#include <machine/bus.h> #endif #if defined(__NetBSD__) || defined(__OpenBSD__) diff --git a/sys/dev/ic/midwayreg.h b/sys/dev/ic/midwayreg.h index 54bf1f75596..27fc0b20283 100644 --- a/sys/dev/ic/midwayreg.h +++ b/sys/dev/ic/midwayreg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: midwayreg.h,v 1.5 1996/11/12 20:30:21 niklas Exp $ */ +/* $OpenBSD: midwayreg.h,v 1.6 1996/11/12 22:46:25 niklas Exp $ */ /* * m i d w a y r e g . h @@ -9,7 +9,7 @@ */ #if defined(sparc) || defined(__FreeBSD__) -/* XXX: gross. netbsd/sparc doesn't have machine/bus.old.h yet. */ +/* XXX: gross. netbsd/sparc doesn't have machine/bus.h yet. */ typedef void * bus_chipset_tag_t; typedef u_int32_t pci_chipset_tag_t; typedef caddr_t bus_mem_handle_t; |