summaryrefslogtreecommitdiff
path: root/sys/arch/alpha/include/bus.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/arch/alpha/include/bus.h')
-rw-r--r--sys/arch/alpha/include/bus.h425
1 files changed, 239 insertions, 186 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_ */