Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 11 Nov 2015 00:45:41 +0000 (UTC)
From:      Oleksandr Tymoshenko <gonzo@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r290667 - head/sys/arm/broadcom/bcm2835
Message-ID:  <201511110045.tAB0jfQh087415@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: gonzo
Date: Wed Nov 11 00:45:41 2015
New Revision: 290667
URL: https://svnweb.freebsd.org/changeset/base/290667

Log:
  Refactor bcm2835_cpufreq to use bcm2835_mbox_property API

Modified:
  head/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c

Modified: head/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c
==============================================================================
--- head/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c	Wed Nov 11 00:41:02 2015	(r290666)
+++ head/sys/arm/broadcom/bcm2835/bcm2835_cpufreq.c	Wed Nov 11 00:45:41 2015	(r290667)
@@ -115,13 +115,6 @@ struct bcm2835_cpufreq_softc {
 	int		voltage_sdram_p;
 	int		turbo_mode;
 
-	/* mbox buffer (physical address) */
-	bus_dma_tag_t	dma_tag;
-	bus_dmamap_t	dma_map;
-	bus_size_t	dma_size;
-	void		*dma_buf;
-	bus_addr_t	dma_phys;
-
 	/* initial hook for waiting mbox intr */
 	struct intr_config_hook	init_hook;
 };
@@ -151,84 +144,10 @@ bcm2835_dump(const void *data, int len)
 #endif
 
 static int
-bcm2835_mbox_call_prop(struct bcm2835_cpufreq_softc *sc)
-{
-	struct bcm2835_mbox_hdr *msg = (struct bcm2835_mbox_hdr *)sc->dma_buf;
-	struct bcm2835_mbox_tag_hdr *tag, *last;
-	uint8_t *up;
-	device_t mbox;
-	size_t hdr_size;
-	int idx;
-	int err;
-
-	/*
-	 * For multiple calls, locking is not here. The caller must have
-	 * VC semaphore.
-	 */
-
-	/* get mbox device */
-	mbox = devclass_get_device(devclass_find("mbox"), 0);
-	if (mbox == NULL) {
-		device_printf(sc->dev, "can't find mbox\n");
-		return (-1);
-	}
-
-	/* go mailbox property */
-#ifdef PROP_DEBUG
-	bcm2835_dump(msg, 64);
-#endif
-	bus_dmamap_sync(sc->dma_tag, sc->dma_map,
-	    BUS_DMASYNC_PREWRITE | BUS_DMASYNC_PREREAD);
-	MBOX_WRITE(mbox, BCM2835_MBOX_CHAN_PROP, (uint32_t)sc->dma_phys);
-	MBOX_READ(mbox, BCM2835_MBOX_CHAN_PROP, &err);
-	bus_dmamap_sync(sc->dma_tag, sc->dma_map, BUS_DMASYNC_POSTREAD);
-#ifdef PROP_DEBUG
-	bcm2835_dump(msg, 64);
-#endif
-
-	/* check response code */
-	if (msg->code != BCM2835_MBOX_CODE_RESP_SUCCESS) {
-		device_printf(sc->dev, "mbox response error\n");
-		return (-1);
-	}
-
-	/* tag = first tag */
-	up = (uint8_t *)msg;
-	hdr_size = sizeof(struct bcm2835_mbox_hdr);
-	tag = (struct bcm2835_mbox_tag_hdr *)(up + hdr_size);
-	/* last = end of buffer specified by header */
-	last = (struct bcm2835_mbox_tag_hdr *)(up + msg->buf_size);
-
-	/* loop unitl end tag (=0x0) */
-	hdr_size = sizeof(struct bcm2835_mbox_tag_hdr);
-	for (idx = 0; tag->tag != 0; idx++) {
-		if ((tag->val_len & BCM2835_MBOX_TAG_VAL_LEN_RESPONSE) == 0) {
-			device_printf(sc->dev, "tag%d response error\n", idx);
-			return (-1);
-		}
-		/* clear response bit */
-		tag->val_len &= ~BCM2835_MBOX_TAG_VAL_LEN_RESPONSE;
-
-		/* get next tag */
-		up = (uint8_t *)tag;
-		tag = (struct bcm2835_mbox_tag_hdr *)(up + hdr_size +
-		    tag->val_buf_size);
-
-		/* check buffer size of header */
-		if (tag > last) {
-			device_printf(sc->dev, "mbox buffer size error\n");
-			return (-1);
-		}
-	}
-
-	return (0);
-}
-
-static int
 bcm2835_cpufreq_get_clock_rate(struct bcm2835_cpufreq_softc *sc,
     uint32_t clock_id)
 {
-	struct msg_get_clock_rate *msg;
+	struct msg_get_clock_rate msg;
 	int rate;
 	int err;
 
@@ -246,26 +165,18 @@ bcm2835_cpufreq_get_clock_rate(struct bc
 	 *       u32: rate (in Hz)
 	 */
 
-	/* using DMA buffer for VC */
-	msg = (struct msg_get_clock_rate *)sc->dma_buf;
-	if (sizeof(*msg) > sc->dma_size) {
-		device_printf(sc->dev, "DMA size overflow (%zu>%lu)\n",
-		    sizeof(*msg), sc->dma_size);
-		return (MSG_ERROR);
-	}
-
 	/* setup single tag buffer */
-	memset(msg, 0, sizeof(*msg));
-	msg->hdr.buf_size = sizeof(*msg);
-	msg->hdr.code = BCM2835_MBOX_CODE_REQ;
-	msg->tag_hdr.tag = BCM2835_MBOX_TAG_GET_CLOCK_RATE;
-	msg->tag_hdr.val_buf_size = sizeof(msg->body);
-	msg->tag_hdr.val_len = sizeof(msg->body.req);
-	msg->body.req.clock_id = clock_id;
-	msg->end_tag = 0;
+	memset(&msg, 0, sizeof(msg));
+	msg.hdr.buf_size = sizeof(msg);
+	msg.hdr.code = BCM2835_MBOX_CODE_REQ;
+	msg.tag_hdr.tag = BCM2835_MBOX_TAG_GET_CLOCK_RATE;
+	msg.tag_hdr.val_buf_size = sizeof(msg.body);
+	msg.tag_hdr.val_len = sizeof(msg.body.req);
+	msg.body.req.clock_id = clock_id;
+	msg.end_tag = 0;
 
 	/* call mailbox property */
-	err = bcm2835_mbox_call_prop(sc);
+	err = bcm2835_mbox_property(&msg, sizeof(msg));
 	if (err) {
 		device_printf(sc->dev, "can't get clock rate (id=%u)\n",
 		    clock_id);
@@ -273,7 +184,7 @@ bcm2835_cpufreq_get_clock_rate(struct bc
 	}
 
 	/* result (Hz) */
-	rate = (int)msg->body.resp.rate_hz;
+	rate = (int)msg.body.resp.rate_hz;
 	DPRINTF("clock = %d(Hz)\n", rate);
 	return (rate);
 }
@@ -282,7 +193,7 @@ static int
 bcm2835_cpufreq_get_max_clock_rate(struct bcm2835_cpufreq_softc *sc,
     uint32_t clock_id)
 {
-	struct msg_get_max_clock_rate *msg;
+	struct msg_get_max_clock_rate msg;
 	int rate;
 	int err;
 
@@ -300,26 +211,18 @@ bcm2835_cpufreq_get_max_clock_rate(struc
 	 *       u32: rate (in Hz)
 	 */
 
-	/* using DMA buffer for VC */
-	msg = (struct msg_get_max_clock_rate *)sc->dma_buf;
-	if (sizeof(*msg) > sc->dma_size) {
-		device_printf(sc->dev, "DMA size overflow (%zu>%lu)\n",
-		    sizeof(*msg), sc->dma_size);
-		return (MSG_ERROR);
-	}
-
 	/* setup single tag buffer */
-	memset(msg, 0, sizeof(*msg));
-	msg->hdr.buf_size = sizeof(*msg);
-	msg->hdr.code = BCM2835_MBOX_CODE_REQ;
-	msg->tag_hdr.tag = BCM2835_MBOX_TAG_GET_MAX_CLOCK_RATE;
-	msg->tag_hdr.val_buf_size = sizeof(msg->body);
-	msg->tag_hdr.val_len = sizeof(msg->body.req);
-	msg->body.req.clock_id = clock_id;
-	msg->end_tag = 0;
+	memset(&msg, 0, sizeof(msg));
+	msg.hdr.buf_size = sizeof(msg);
+	msg.hdr.code = BCM2835_MBOX_CODE_REQ;
+	msg.tag_hdr.tag = BCM2835_MBOX_TAG_GET_MAX_CLOCK_RATE;
+	msg.tag_hdr.val_buf_size = sizeof(msg.body);
+	msg.tag_hdr.val_len = sizeof(msg.body.req);
+	msg.body.req.clock_id = clock_id;
+	msg.end_tag = 0;
 
 	/* call mailbox property */
-	err = bcm2835_mbox_call_prop(sc);
+	err = bcm2835_mbox_property(&msg, sizeof(msg));
 	if (err) {
 		device_printf(sc->dev, "can't get max clock rate (id=%u)\n",
 		    clock_id);
@@ -327,7 +230,7 @@ bcm2835_cpufreq_get_max_clock_rate(struc
 	}
 
 	/* result (Hz) */
-	rate = (int)msg->body.resp.rate_hz;
+	rate = (int)msg.body.resp.rate_hz;
 	DPRINTF("clock = %d(Hz)\n", rate);
 	return (rate);
 }
@@ -336,7 +239,7 @@ static int
 bcm2835_cpufreq_get_min_clock_rate(struct bcm2835_cpufreq_softc *sc,
     uint32_t clock_id)
 {
-	struct msg_get_min_clock_rate *msg;
+	struct msg_get_min_clock_rate msg;
 	int rate;
 	int err;
 
@@ -354,26 +257,18 @@ bcm2835_cpufreq_get_min_clock_rate(struc
 	 *       u32: rate (in Hz)
 	 */
 
-	/* using DMA buffer for VC */
-	msg = (struct msg_get_min_clock_rate *)sc->dma_buf;
-	if (sizeof(*msg) > sc->dma_size) {
-		device_printf(sc->dev, "DMA size overflow (%zu>%lu)\n",
-		    sizeof(*msg), sc->dma_size);
-		return (MSG_ERROR);
-	}
-
 	/* setup single tag buffer */
-	memset(msg, 0, sizeof(*msg));
-	msg->hdr.buf_size = sizeof(*msg);
-	msg->hdr.code = BCM2835_MBOX_CODE_REQ;
-	msg->tag_hdr.tag = BCM2835_MBOX_TAG_GET_MIN_CLOCK_RATE;
-	msg->tag_hdr.val_buf_size = sizeof(msg->body);
-	msg->tag_hdr.val_len = sizeof(msg->body.req);
-	msg->body.req.clock_id = clock_id;
-	msg->end_tag = 0;
+	memset(&msg, 0, sizeof(msg));
+	msg.hdr.buf_size = sizeof(msg);
+	msg.hdr.code = BCM2835_MBOX_CODE_REQ;
+	msg.tag_hdr.tag = BCM2835_MBOX_TAG_GET_MIN_CLOCK_RATE;
+	msg.tag_hdr.val_buf_size = sizeof(msg.body);
+	msg.tag_hdr.val_len = sizeof(msg.body.req);
+	msg.body.req.clock_id = clock_id;
+	msg.end_tag = 0;
 
 	/* call mailbox property */
-	err = bcm2835_mbox_call_prop(sc);
+	err = bcm2835_mbox_property(&msg, sizeof(msg));
 	if (err) {
 		device_printf(sc->dev, "can't get min clock rate (id=%u)\n",
 		    clock_id);
@@ -381,7 +276,7 @@ bcm2835_cpufreq_get_min_clock_rate(struc
 	}
 
 	/* result (Hz) */
-	rate = (int)msg->body.resp.rate_hz;
+	rate = (int)msg.body.resp.rate_hz;
 	DPRINTF("clock = %d(Hz)\n", rate);
 	return (rate);
 }
@@ -390,7 +285,7 @@ static int
 bcm2835_cpufreq_set_clock_rate(struct bcm2835_cpufreq_softc *sc,
     uint32_t clock_id, uint32_t rate_hz)
 {
-	struct msg_set_clock_rate *msg;
+	struct msg_set_clock_rate msg;
 	int rate;
 	int err;
 
@@ -409,27 +304,19 @@ bcm2835_cpufreq_set_clock_rate(struct bc
 	 *       u32: rate (in Hz)
 	 */
 
-	/* using DMA buffer for VC */
-	msg = (struct msg_set_clock_rate *)sc->dma_buf;
-	if (sizeof(*msg) > sc->dma_size) {
-		device_printf(sc->dev, "DMA size overflow (%zu>%lu)\n",
-		    sizeof(*msg), sc->dma_size);
-		return (MSG_ERROR);
-	}
-
 	/* setup single tag buffer */
-	memset(msg, 0, sizeof(*msg));
-	msg->hdr.buf_size = sizeof(*msg);
-	msg->hdr.code = BCM2835_MBOX_CODE_REQ;
-	msg->tag_hdr.tag = BCM2835_MBOX_TAG_SET_CLOCK_RATE;
-	msg->tag_hdr.val_buf_size = sizeof(msg->body);
-	msg->tag_hdr.val_len = sizeof(msg->body.req);
-	msg->body.req.clock_id = clock_id;
-	msg->body.req.rate_hz = rate_hz;
-	msg->end_tag = 0;
+	memset(&msg, 0, sizeof(msg));
+	msg.hdr.buf_size = sizeof(msg);
+	msg.hdr.code = BCM2835_MBOX_CODE_REQ;
+	msg.tag_hdr.tag = BCM2835_MBOX_TAG_SET_CLOCK_RATE;
+	msg.tag_hdr.val_buf_size = sizeof(msg.body);
+	msg.tag_hdr.val_len = sizeof(msg.body.req);
+	msg.body.req.clock_id = clock_id;
+	msg.body.req.rate_hz = rate_hz;
+	msg.end_tag = 0;
 
 	/* call mailbox property */
-	err = bcm2835_mbox_call_prop(sc);
+	err = bcm2835_mbox_property(&msg, sizeof(msg));
 	if (err) {
 		device_printf(sc->dev, "can't set clock rate (id=%u)\n",
 		    clock_id);
@@ -447,18 +334,18 @@ bcm2835_cpufreq_set_clock_rate(struct bc
 		 */
 
 		/* setup single tag buffer */
-		memset(msg, 0, sizeof(*msg));
-		msg->hdr.buf_size = sizeof(*msg);
-		msg->hdr.code = BCM2835_MBOX_CODE_REQ;
-		msg->tag_hdr.tag = BCM2835_MBOX_TAG_SET_CLOCK_RATE;
-		msg->tag_hdr.val_buf_size = sizeof(msg->body);
-		msg->tag_hdr.val_len = sizeof(msg->body.req);
-		msg->body.req.clock_id = clock_id;
-		msg->body.req.rate_hz = rate_hz;
-		msg->end_tag = 0;
+		memset(&msg, 0, sizeof(msg));
+		msg.hdr.buf_size = sizeof(msg);
+		msg.hdr.code = BCM2835_MBOX_CODE_REQ;
+		msg.tag_hdr.tag = BCM2835_MBOX_TAG_SET_CLOCK_RATE;
+		msg.tag_hdr.val_buf_size = sizeof(msg.body);
+		msg.tag_hdr.val_len = sizeof(msg.body.req);
+		msg.body.req.clock_id = clock_id;
+		msg.body.req.rate_hz = rate_hz;
+		msg.end_tag = 0;
 
 		/* call mailbox property */
-		err = bcm2835_mbox_call_prop(sc);
+		err = bcm2835_mbox_property(&msg, sizeof(msg));
 		if (err) {
 			device_printf(sc->dev,
 			    "can't set clock rate (id=%u)\n", clock_id);
@@ -467,7 +354,7 @@ bcm2835_cpufreq_set_clock_rate(struct bc
 	}
 
 	/* result (Hz) */
-	rate = (int)msg->body.resp.rate_hz;
+	rate = (int)msg.body.resp.rate_hz;
 	DPRINTF("clock = %d(Hz)\n", rate);
 	return (rate);
 }
@@ -475,7 +362,7 @@ bcm2835_cpufreq_set_clock_rate(struct bc
 static int
 bcm2835_cpufreq_get_turbo(struct bcm2835_cpufreq_softc *sc)
 {
-	struct msg_get_turbo *msg;
+	struct msg_get_turbo msg;
 	int level;
 	int err;
 
@@ -493,33 +380,25 @@ bcm2835_cpufreq_get_turbo(struct bcm2835
 	 *       u32: level
 	 */
 
-	/* using DMA buffer for VC */
-	msg = (struct msg_get_turbo *)sc->dma_buf;
-	if (sizeof(*msg) > sc->dma_size) {
-		device_printf(sc->dev, "DMA size overflow (%zu>%lu)\n",
-		    sizeof(*msg), sc->dma_size);
-		return (MSG_ERROR);
-	}
-
 	/* setup single tag buffer */
-	memset(msg, 0, sizeof(*msg));
-	msg->hdr.buf_size = sizeof(*msg);
-	msg->hdr.code = BCM2835_MBOX_CODE_REQ;
-	msg->tag_hdr.tag = BCM2835_MBOX_TAG_GET_TURBO;
-	msg->tag_hdr.val_buf_size = sizeof(msg->body);
-	msg->tag_hdr.val_len = sizeof(msg->body.req);
-	msg->body.req.id = 0;
-	msg->end_tag = 0;
+	memset(&msg, 0, sizeof(msg));
+	msg.hdr.buf_size = sizeof(msg);
+	msg.hdr.code = BCM2835_MBOX_CODE_REQ;
+	msg.tag_hdr.tag = BCM2835_MBOX_TAG_GET_TURBO;
+	msg.tag_hdr.val_buf_size = sizeof(msg.body);
+	msg.tag_hdr.val_len = sizeof(msg.body.req);
+	msg.body.req.id = 0;
+	msg.end_tag = 0;
 
 	/* call mailbox property */
-	err = bcm2835_mbox_call_prop(sc);
+	err = bcm2835_mbox_property(&msg, sizeof(msg));
 	if (err) {
 		device_printf(sc->dev, "can't get turbo\n");
 		return (MSG_ERROR);
 	}
 
 	/* result 0=non-turbo, 1=turbo */
-	level = (int)msg->body.resp.level;
+	level = (int)msg.body.resp.level;
 	DPRINTF("level = %d\n", level);
 	return (level);
 }
@@ -527,7 +406,7 @@ bcm2835_cpufreq_get_turbo(struct bcm2835
 static int
 bcm2835_cpufreq_set_turbo(struct bcm2835_cpufreq_softc *sc, uint32_t level)
 {
-	struct msg_set_turbo *msg;
+	struct msg_set_turbo msg;
 	int value;
 	int err;
 
@@ -546,38 +425,30 @@ bcm2835_cpufreq_set_turbo(struct bcm2835
 	 *       u32: level
 	 */
 
-	/* using DMA buffer for VC */
-	msg = (struct msg_set_turbo *)sc->dma_buf;
-	if (sizeof(*msg) > sc->dma_size) {
-		device_printf(sc->dev, "DMA size overflow (%zu>%lu)\n",
-		    sizeof(*msg), sc->dma_size);
-		return (MSG_ERROR);
-	}
-
 	/* replace unknown value to OFF */
 	if (level != BCM2835_MBOX_TURBO_ON && level != BCM2835_MBOX_TURBO_OFF)
 		level = BCM2835_MBOX_TURBO_OFF;
 
 	/* setup single tag buffer */
-	memset(msg, 0, sizeof(*msg));
-	msg->hdr.buf_size = sizeof(*msg);
-	msg->hdr.code = BCM2835_MBOX_CODE_REQ;
-	msg->tag_hdr.tag = BCM2835_MBOX_TAG_SET_TURBO;
-	msg->tag_hdr.val_buf_size = sizeof(msg->body);
-	msg->tag_hdr.val_len = sizeof(msg->body.req);
-	msg->body.req.id = 0;
-	msg->body.req.level = level;
-	msg->end_tag = 0;
+	memset(&msg, 0, sizeof(msg));
+	msg.hdr.buf_size = sizeof(msg);
+	msg.hdr.code = BCM2835_MBOX_CODE_REQ;
+	msg.tag_hdr.tag = BCM2835_MBOX_TAG_SET_TURBO;
+	msg.tag_hdr.val_buf_size = sizeof(msg.body);
+	msg.tag_hdr.val_len = sizeof(msg.body.req);
+	msg.body.req.id = 0;
+	msg.body.req.level = level;
+	msg.end_tag = 0;
 
 	/* call mailbox property */
-	err = bcm2835_mbox_call_prop(sc);
+	err = bcm2835_mbox_property(&msg, sizeof(msg));
 	if (err) {
 		device_printf(sc->dev, "can't set turbo\n");
 		return (MSG_ERROR);
 	}
 
 	/* result 0=non-turbo, 1=turbo */
-	value = (int)msg->body.resp.level;
+	value = (int)msg.body.resp.level;
 	DPRINTF("level = %d\n", value);
 	return (value);
 }
@@ -586,7 +457,7 @@ static int
 bcm2835_cpufreq_get_voltage(struct bcm2835_cpufreq_softc *sc,
     uint32_t voltage_id)
 {
-	struct msg_get_voltage *msg;
+	struct msg_get_voltage msg;
 	int value;
 	int err;
 
@@ -604,33 +475,25 @@ bcm2835_cpufreq_get_voltage(struct bcm28
 	 *       u32: value (offset from 1.2V in units of 0.025V)
 	 */
 
-	/* using DMA buffer for VC */
-	msg = (struct msg_get_voltage *)sc->dma_buf;
-	if (sizeof(*msg) > sc->dma_size) {
-		device_printf(sc->dev, "DMA size overflow (%zu>%lu)\n",
-		    sizeof(*msg), sc->dma_size);
-		return (MSG_ERROR);
-	}
-
 	/* setup single tag buffer */
-	memset(msg, 0, sizeof(*msg));
-	msg->hdr.buf_size = sizeof(*msg);
-	msg->hdr.code = BCM2835_MBOX_CODE_REQ;
-	msg->tag_hdr.tag = BCM2835_MBOX_TAG_GET_VOLTAGE;
-	msg->tag_hdr.val_buf_size = sizeof(msg->body);
-	msg->tag_hdr.val_len = sizeof(msg->body.req);
-	msg->body.req.voltage_id = voltage_id;
-	msg->end_tag = 0;
+	memset(&msg, 0, sizeof(msg));
+	msg.hdr.buf_size = sizeof(msg);
+	msg.hdr.code = BCM2835_MBOX_CODE_REQ;
+	msg.tag_hdr.tag = BCM2835_MBOX_TAG_GET_VOLTAGE;
+	msg.tag_hdr.val_buf_size = sizeof(msg.body);
+	msg.tag_hdr.val_len = sizeof(msg.body.req);
+	msg.body.req.voltage_id = voltage_id;
+	msg.end_tag = 0;
 
 	/* call mailbox property */
-	err = bcm2835_mbox_call_prop(sc);
+	err = bcm2835_mbox_property(&msg, sizeof(msg));
 	if (err) {
 		device_printf(sc->dev, "can't get voltage\n");
 		return (MSG_ERROR);
 	}
 
 	/* result (offset from 1.2V) */
-	value = (int)msg->body.resp.value;
+	value = (int)msg.body.resp.value;
 	DPRINTF("value = %d\n", value);
 	return (value);
 }
@@ -639,7 +502,7 @@ static int
 bcm2835_cpufreq_get_max_voltage(struct bcm2835_cpufreq_softc *sc,
     uint32_t voltage_id)
 {
-	struct msg_get_max_voltage *msg;
+	struct msg_get_max_voltage msg;
 	int value;
 	int err;
 
@@ -657,33 +520,25 @@ bcm2835_cpufreq_get_max_voltage(struct b
 	 *       u32: value (offset from 1.2V in units of 0.025V)
 	 */
 
-	/* using DMA buffer for VC */
-	msg = (struct msg_get_max_voltage *)sc->dma_buf;
-	if (sizeof(*msg) > sc->dma_size) {
-		device_printf(sc->dev, "DMA size overflow (%zu>%lu)\n",
-		    sizeof(*msg), sc->dma_size);
-		return (MSG_ERROR);
-	}
-
 	/* setup single tag buffer */
-	memset(msg, 0, sizeof(*msg));
-	msg->hdr.buf_size = sizeof(*msg);
-	msg->hdr.code = BCM2835_MBOX_CODE_REQ;
-	msg->tag_hdr.tag = BCM2835_MBOX_TAG_GET_MAX_VOLTAGE;
-	msg->tag_hdr.val_buf_size = sizeof(msg->body);
-	msg->tag_hdr.val_len = sizeof(msg->body.req);
-	msg->body.req.voltage_id = voltage_id;
-	msg->end_tag = 0;
+	memset(&msg, 0, sizeof(msg));
+	msg.hdr.buf_size = sizeof(msg);
+	msg.hdr.code = BCM2835_MBOX_CODE_REQ;
+	msg.tag_hdr.tag = BCM2835_MBOX_TAG_GET_MAX_VOLTAGE;
+	msg.tag_hdr.val_buf_size = sizeof(msg.body);
+	msg.tag_hdr.val_len = sizeof(msg.body.req);
+	msg.body.req.voltage_id = voltage_id;
+	msg.end_tag = 0;
 
 	/* call mailbox property */
-	err = bcm2835_mbox_call_prop(sc);
+	err = bcm2835_mbox_property(&msg, sizeof(msg));
 	if (err) {
 		device_printf(sc->dev, "can't get max voltage\n");
 		return (MSG_ERROR);
 	}
 
 	/* result (offset from 1.2V) */
-	value = (int)msg->body.resp.value;
+	value = (int)msg.body.resp.value;
 	DPRINTF("value = %d\n", value);
 	return (value);
 }
@@ -691,7 +546,7 @@ static int
 bcm2835_cpufreq_get_min_voltage(struct bcm2835_cpufreq_softc *sc,
     uint32_t voltage_id)
 {
-	struct msg_get_min_voltage *msg;
+	struct msg_get_min_voltage msg;
 	int value;
 	int err;
 
@@ -709,33 +564,25 @@ bcm2835_cpufreq_get_min_voltage(struct b
 	 *       u32: value (offset from 1.2V in units of 0.025V)
 	 */
 
-	/* using DMA buffer for VC */
-	msg = (struct msg_get_min_voltage *)sc->dma_buf;
-	if (sizeof(*msg) > sc->dma_size) {
-		device_printf(sc->dev, "DMA size overflow (%zu>%lu)\n",
-		    sizeof(*msg), sc->dma_size);
-		return (MSG_ERROR);
-	}
-
 	/* setup single tag buffer */
-	memset(msg, 0, sizeof(*msg));
-	msg->hdr.buf_size = sizeof(*msg);
-	msg->hdr.code = BCM2835_MBOX_CODE_REQ;
-	msg->tag_hdr.tag = BCM2835_MBOX_TAG_GET_MIN_VOLTAGE;
-	msg->tag_hdr.val_buf_size = sizeof(msg->body);
-	msg->tag_hdr.val_len = sizeof(msg->body.req);
-	msg->body.req.voltage_id = voltage_id;
-	msg->end_tag = 0;
+	memset(&msg, 0, sizeof(msg));
+	msg.hdr.buf_size = sizeof(msg);
+	msg.hdr.code = BCM2835_MBOX_CODE_REQ;
+	msg.tag_hdr.tag = BCM2835_MBOX_TAG_GET_MIN_VOLTAGE;
+	msg.tag_hdr.val_buf_size = sizeof(msg.body);
+	msg.tag_hdr.val_len = sizeof(msg.body.req);
+	msg.body.req.voltage_id = voltage_id;
+	msg.end_tag = 0;
 
 	/* call mailbox property */
-	err = bcm2835_mbox_call_prop(sc);
+	err = bcm2835_mbox_property(&msg, sizeof(msg));
 	if (err) {
 		device_printf(sc->dev, "can't get min voltage\n");
 		return (MSG_ERROR);
 	}
 
 	/* result (offset from 1.2V) */
-	value = (int)msg->body.resp.value;
+	value = (int)msg.body.resp.value;
 	DPRINTF("value = %d\n", value);
 	return (value);
 }
@@ -744,7 +591,7 @@ static int
 bcm2835_cpufreq_set_voltage(struct bcm2835_cpufreq_softc *sc,
     uint32_t voltage_id, int32_t value)
 {
-	struct msg_set_voltage *msg;
+	struct msg_set_voltage msg;
 	int err;
 
 	/*
@@ -773,34 +620,26 @@ bcm2835_cpufreq_set_voltage(struct bcm28
 		return (MSG_ERROR);
 	}
 
-	/* using DMA buffer for VC */
-	msg = (struct msg_set_voltage *)sc->dma_buf;
-	if (sizeof(*msg) > sc->dma_size) {
-		device_printf(sc->dev, "DMA size overflow (%zu>%lu)\n",
-		    sizeof(*msg), sc->dma_size);
-		return (MSG_ERROR);
-	}
-
 	/* setup single tag buffer */
-	memset(msg, 0, sizeof(*msg));
-	msg->hdr.buf_size = sizeof(*msg);
-	msg->hdr.code = BCM2835_MBOX_CODE_REQ;
-	msg->tag_hdr.tag = BCM2835_MBOX_TAG_SET_VOLTAGE;
-	msg->tag_hdr.val_buf_size = sizeof(msg->body);
-	msg->tag_hdr.val_len = sizeof(msg->body.req);
-	msg->body.req.voltage_id = voltage_id;
-	msg->body.req.value = (uint32_t)value;
-	msg->end_tag = 0;
+	memset(&msg, 0, sizeof(msg));
+	msg.hdr.buf_size = sizeof(msg);
+	msg.hdr.code = BCM2835_MBOX_CODE_REQ;
+	msg.tag_hdr.tag = BCM2835_MBOX_TAG_SET_VOLTAGE;
+	msg.tag_hdr.val_buf_size = sizeof(msg.body);
+	msg.tag_hdr.val_len = sizeof(msg.body.req);
+	msg.body.req.voltage_id = voltage_id;
+	msg.body.req.value = (uint32_t)value;
+	msg.end_tag = 0;
 
 	/* call mailbox property */
-	err = bcm2835_mbox_call_prop(sc);
+	err = bcm2835_mbox_property(&msg, sizeof(msg));
 	if (err) {
 		device_printf(sc->dev, "can't set voltage\n");
 		return (MSG_ERROR);
 	}
 
 	/* result (offset from 1.2V) */
-	value = (int)msg->body.resp.value;
+	value = (int)msg.body.resp.value;
 	DPRINTF("value = %d\n", value);
 	return (value);
 }
@@ -808,7 +647,7 @@ bcm2835_cpufreq_set_voltage(struct bcm28
 static int
 bcm2835_cpufreq_get_temperature(struct bcm2835_cpufreq_softc *sc)
 {
-	struct msg_get_temperature *msg;
+	struct msg_get_temperature msg;
 	int value;
 	int err;
 
@@ -826,33 +665,25 @@ bcm2835_cpufreq_get_temperature(struct b
 	 *       u32: value
 	 */
 
-	/* using DMA buffer for VC */
-	msg = (struct msg_get_temperature *)sc->dma_buf;
-	if (sizeof(*msg) > sc->dma_size) {
-		device_printf(sc->dev, "DMA size overflow (%zu>%lu)\n",
-		    sizeof(*msg), sc->dma_size);
-		return (MSG_ERROR);
-	}
-
 	/* setup single tag buffer */
-	memset(msg, 0, sizeof(*msg));
-	msg->hdr.buf_size = sizeof(*msg);
-	msg->hdr.code = BCM2835_MBOX_CODE_REQ;
-	msg->tag_hdr.tag = BCM2835_MBOX_TAG_GET_TEMPERATURE;
-	msg->tag_hdr.val_buf_size = sizeof(msg->body);
-	msg->tag_hdr.val_len = sizeof(msg->body.req);
-	msg->body.req.temperature_id = 0;
-	msg->end_tag = 0;
+	memset(&msg, 0, sizeof(msg));
+	msg.hdr.buf_size = sizeof(msg);
+	msg.hdr.code = BCM2835_MBOX_CODE_REQ;
+	msg.tag_hdr.tag = BCM2835_MBOX_TAG_GET_TEMPERATURE;
+	msg.tag_hdr.val_buf_size = sizeof(msg.body);
+	msg.tag_hdr.val_len = sizeof(msg.body.req);
+	msg.body.req.temperature_id = 0;
+	msg.end_tag = 0;
 
 	/* call mailbox property */
-	err = bcm2835_mbox_call_prop(sc);
+	err = bcm2835_mbox_property(&msg, sizeof(msg));
 	if (err) {
 		device_printf(sc->dev, "can't get temperature\n");
 		return (MSG_ERROR);
 	}
 
 	/* result (temperature of degree C) */
-	value = (int)msg->body.resp.value;
+	value = (int)msg.body.resp.value;
 	DPRINTF("value = %d\n", value);
 	return (value);
 }
@@ -1432,23 +1263,11 @@ bcm2835_cpufreq_probe(device_t dev)
 	return (0);
 }
 
-static void
-bcm2835_cpufreq_cb(void *arg, bus_dma_segment_t *segs, int nseg, int err)
-{
-	bus_addr_t *addr;
-
-	if (err)
-		return;
-	addr = (bus_addr_t *)arg;
-	*addr = PHYS_TO_VCBUS(segs[0].ds_addr);
-}
-
 static int
 bcm2835_cpufreq_attach(device_t dev)
 {
 	struct bcm2835_cpufreq_softc *sc;
 	struct sysctl_oid *oid;
-	int err;
 
 	/* set self dev */
 	sc = device_get_softc(dev);
@@ -1464,41 +1283,6 @@ bcm2835_cpufreq_attach(device_t dev)
 	sc->max_voltage_core = 0;
 	sc->min_voltage_core = 0;
 
-	/* create VC mbox buffer */
-	sc->dma_size = PAGE_SIZE;
-	err = bus_dma_tag_create(
-	    bus_get_dma_tag(sc->dev),
-	    PAGE_SIZE, 0,		/* alignment, boundary */
-	    BUS_SPACE_MAXADDR_32BIT,	/* lowaddr */
-	    BUS_SPACE_MAXADDR,		/* highaddr */
-	    NULL, NULL,			/* filter, filterarg */
-	    sc->dma_size, 1,		/* maxsize, nsegments */
-	    sc->dma_size, 0,		/* maxsegsize, flags */
-	    NULL, NULL,			/* lockfunc, lockarg */
-	    &sc->dma_tag);
-	if (err) {
-		device_printf(dev, "can't create DMA tag\n");
-		return (ENXIO);
-	}
-
-	err = bus_dmamem_alloc(sc->dma_tag, (void **)&sc->dma_buf, 0,
-	    &sc->dma_map);
-	if (err) {
-		bus_dma_tag_destroy(sc->dma_tag);
-		device_printf(dev, "can't allocate dmamem\n");
-		return (ENXIO);
-	}
-
-	err = bus_dmamap_load(sc->dma_tag, sc->dma_map, sc->dma_buf,
-	    sc->dma_size, bcm2835_cpufreq_cb, &sc->dma_phys, 0);
-	if (err) {
-		bus_dmamem_free(sc->dma_tag, sc->dma_buf, sc->dma_map);
-		bus_dma_tag_destroy(sc->dma_tag);
-		device_printf(dev, "can't load DMA map\n");
-		return (ENXIO);
-	}
-	/* OK, ready to use VC buffer */
-
 	/* setup sysctl at first device */
 	if (device_get_unit(dev) == 0) {
 		sysctl_ctx_init(&bcm2835_sysctl_ctx);
@@ -1568,9 +1352,6 @@ bcm2835_cpufreq_attach(device_t dev)
 	sc->init_hook.ich_arg = sc;
 
 	if (config_intrhook_establish(&sc->init_hook) != 0) {
-		bus_dmamap_unload(sc->dma_tag, sc->dma_map);
-		bus_dmamem_free(sc->dma_tag, sc->dma_buf, sc->dma_map);
-		bus_dma_tag_destroy(sc->dma_tag);
 		device_printf(dev, "config_intrhook_establish failed\n");
 		return (ENOMEM);
 	}
@@ -1590,13 +1371,6 @@ bcm2835_cpufreq_detach(device_t dev)
 
 	sema_destroy(&vc_sema);
 
-	if (sc->dma_phys != 0)
-		bus_dmamap_unload(sc->dma_tag, sc->dma_map);
-	if (sc->dma_buf != NULL)
-		bus_dmamem_free(sc->dma_tag, sc->dma_buf, sc->dma_map);
-	if (sc->dma_tag != NULL)
-		bus_dma_tag_destroy(sc->dma_tag);
-
 	return (cpufreq_unregister(dev));
 }
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201511110045.tAB0jfQh087415>