svn commit: r286768 - head/sys/arm64/arm64

Andrew Turner andrew at FreeBSD.org
Fri Aug 14 09:55:26 UTC 2015


Author: andrew
Date: Fri Aug 14 09:55:25 2015
New Revision: 286768
URL: https://svnweb.freebsd.org/changeset/base/286768

Log:
  Add support for bus_space_read_region and bus_space_write_region. This is
  needed for the dwc USB controller driver.
  
  Sponsored by:	ABT Systems Ltd

Modified:
  head/sys/arm64/arm64/bus_machdep.c
  head/sys/arm64/arm64/bus_space_asm.S

Modified: head/sys/arm64/arm64/bus_machdep.c
==============================================================================
--- head/sys/arm64/arm64/bus_machdep.c	Fri Aug 14 09:48:23 2015	(r286767)
+++ head/sys/arm64/arm64/bus_machdep.c	Fri Aug 14 09:55:25 2015	(r286768)
@@ -49,6 +49,15 @@ void generic_bs_rm_4(void *, bus_space_h
 void generic_bs_rm_8(void *, bus_space_handle_t, bus_size_t, uint64_t *,
     bus_size_t);
 
+void generic_bs_rr_1(void *, bus_space_handle_t, bus_size_t, uint8_t *,
+    bus_size_t);
+void generic_bs_rr_2(void *, bus_space_handle_t, bus_size_t, uint16_t *,
+    bus_size_t);
+void generic_bs_rr_4(void *, bus_space_handle_t, bus_size_t, uint32_t *,
+    bus_size_t);
+void generic_bs_rr_8(void *, bus_space_handle_t, bus_size_t, uint64_t *,
+    bus_size_t);
+
 void generic_bs_w_1(void *, bus_space_handle_t, bus_size_t, uint8_t);
 void generic_bs_w_2(void *, bus_space_handle_t, bus_size_t, uint16_t);
 void generic_bs_w_4(void *, bus_space_handle_t, bus_size_t, uint32_t);
@@ -63,6 +72,15 @@ void generic_bs_wm_4(void *, bus_space_h
 void generic_bs_wm_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *,
     bus_size_t);
 
+void generic_bs_wr_1(void *, bus_space_handle_t, bus_size_t, const uint8_t *,
+    bus_size_t);
+void generic_bs_wr_2(void *, bus_space_handle_t, bus_size_t, const uint16_t *,
+    bus_size_t);
+void generic_bs_wr_4(void *, bus_space_handle_t, bus_size_t, const uint32_t *,
+    bus_size_t);
+void generic_bs_wr_8(void *, bus_space_handle_t, bus_size_t, const uint64_t *,
+    bus_size_t);
+
 static int
 generic_bs_map(void *t, bus_addr_t bpa, bus_size_t size, int flags,
     bus_space_handle_t *bshp)
@@ -126,6 +144,12 @@ struct bus_space memmap_bus = {
 	.bs_rm_4 = generic_bs_rm_4,
 	.bs_rm_8 = generic_bs_rm_8,
 
+	/* read region */
+	.bs_rr_1 = generic_bs_rr_1,
+	.bs_rr_2 = generic_bs_rr_2,
+	.bs_rr_4 = generic_bs_rr_4,
+	.bs_rr_8 = generic_bs_rr_8,
+
 	/* write single */
 	.bs_w_1 = generic_bs_w_1,
 	.bs_w_2 = generic_bs_w_2,
@@ -139,10 +163,10 @@ struct bus_space memmap_bus = {
 	.bs_wm_8 = generic_bs_wm_8,
 
 	/* write region */
-	.bs_wr_1 = NULL,
-	.bs_wr_2 = NULL,
-	.bs_wr_4 = NULL,
-	.bs_wr_8 = NULL,
+	.bs_wr_1 = generic_bs_wr_1,
+	.bs_wr_2 = generic_bs_wr_2,
+	.bs_wr_4 = generic_bs_wr_4,
+	.bs_wr_8 = generic_bs_wr_8,
 
 	/* set multiple */
 	.bs_sm_1 = NULL,

Modified: head/sys/arm64/arm64/bus_space_asm.S
==============================================================================
--- head/sys/arm64/arm64/bus_space_asm.S	Fri Aug 14 09:48:23 2015	(r286767)
+++ head/sys/arm64/arm64/bus_space_asm.S	Fri Aug 14 09:55:25 2015	(r286768)
@@ -133,6 +133,90 @@ ENTRY(generic_bs_rm_8)
 2:	ret
 END(generic_bs_rm_8)
 
+ENTRY(generic_bs_rr_1)
+	/* Is there is anything to read. */
+	cbz	x4, 2f
+
+	/* Calculate the device address. */
+	add	x0, x1, x2
+	/*
+	 * x0 = The device address.
+	 * x3 = The kernel address.
+	 * x4 = Count
+	 */
+
+	/* Read the data. */
+1:	ldrb	w1, [x0], #1
+	strb	w1, [x3], #1
+	subs	x4, x4, #1
+	b.ne	1b
+
+2:	ret
+END(generic_bs_rr_1)
+
+ENTRY(generic_bs_rr_2)
+	/* Is there is anything to read. */
+	cbz	x4, 2f
+
+	/* Calculate the device address. */
+	add	x0, x1, x2
+	/*
+	 * x0 = The device address.
+	 * x3 = The kernel address.
+	 * x4 = Count
+	 */
+
+	/* Read the data. */
+1:	ldrh	w1, [x0], #2
+	strh	w1, [x3], #2
+	subs	x4, x4, #1
+	b.ne	1b
+
+2:	ret
+END(generic_bs_rr_2)
+
+ENTRY(generic_bs_rr_4)
+	/* Is there is anything to read. */
+	cbz	x4, 2f
+
+	/* Calculate the device address. */
+	add	x0, x1, x2
+	/*
+	 * x0 = The device address.
+	 * x3 = The kernel address.
+	 * x4 = Count
+	 */
+
+	/* Read the data. */
+1:	ldr	w1, [x0], #4
+	str	w1, [x3], #4
+	subs	x4, x4, #1
+	b.ne	1b
+
+2:	ret
+END(generic_bs_rr_4)
+
+ENTRY(generic_bs_rr_8)
+	/* Is there is anything to read. */
+	cbz	x4, 2f
+
+	/* Calculate the device address. */
+	add	x0, x1, x2
+	/*
+	 * x0 = The device address.
+	 * x3 = The kernel address.
+	 * x4 = Count
+	 */
+
+	/* Read the data. */
+1:	ldr	x1, [x0], #8
+	str	x1, [x3], #8
+	subs	x4, x4, #1
+	b.ne	1b
+
+2:	ret
+END(generic_bs_rr_8)
+
 
 ENTRY(generic_bs_w_1)
 	strb	w3, [x1, x2]
@@ -233,3 +317,83 @@ ENTRY(generic_bs_wm_8)
 
 2:	ret
 END(generic_bs_wm_8)
+
+ENTRY(generic_bs_wr_1)
+	/* Is there is anything to write. */
+	cbz	x4, 2f
+	
+	add	x0, x1, x2
+	/*
+	 * x0 = The device address.
+	 * x3 = The kernel address.
+	 * x4 = Count
+	 */
+
+	/* Write the data */
+1:	ldrb	w1, [x3], #1
+	strb	w1, [x0], #1
+	subs	x4, x4, #1
+	b.ne	1b
+
+2:	ret
+END(generic_bs_wr_1)
+
+ENTRY(generic_bs_wr_2)
+	/* Is there is anything to write. */
+	cbz	x4, 2f
+	
+	add	x0, x1, x2
+	/*
+	 * x0 = The device address.
+	 * x3 = The kernel address.
+	 * x4 = Count
+	 */
+
+	/* Write the data */
+1:	ldrh	w1, [x3], #2
+	strh	w1, [x0], #2
+	subs	x4, x4, #1
+	b.ne	1b
+
+2:	ret
+END(generic_bs_wr_2)
+
+ENTRY(generic_bs_wr_4)
+	/* Is there is anything to write. */
+	cbz	x4, 2f
+	
+	add	x0, x1, x2
+	/*
+	 * x0 = The device address.
+	 * x3 = The kernel address.
+	 * x4 = Count
+	 */
+
+	/* Write the data */
+1:	ldr	w1, [x3], #4
+	str	w1, [x0], #4
+	subs	x4, x4, #1
+	b.ne	1b
+
+2:	ret
+END(generic_bs_wr_4)
+
+ENTRY(generic_bs_wr_8)
+	/* Is there is anything to write. */
+	cbz	x4, 2f
+	
+	add	x0, x1, x2
+	/*
+	 * x0 = The device address.
+	 * x3 = The kernel address.
+	 * x4 = Count
+	 */
+
+	/* Write the data */
+1:	ldr	x1, [x3], #8
+	str	x1, [x0], #8
+	subs	x4, x4, #1
+	b.ne	1b
+
+2:	ret
+END(generic_bs_wr_8)


More information about the svn-src-all mailing list