summaryrefslogtreecommitdiffstats
path: root/sys/mips
diff options
context:
space:
mode:
authorjchandra <jchandra@FreeBSD.org>2010-07-29 20:41:40 +0000
committerjchandra <jchandra@FreeBSD.org>2010-07-29 20:41:40 +0000
commit516c7c4bda55d5cabead12abdfca042db4b914fa (patch)
tree5f75f786523690df148a8184e1e7934e100cb5a9 /sys/mips
parenta25f240d5cbd2d3f4bf9d6373bea1d8b02e5fd80 (diff)
downloadFreeBSD-src-516c7c4bda55d5cabead12abdfca042db4b914fa.zip
FreeBSD-src-516c7c4bda55d5cabead12abdfca042db4b914fa.tar.gz
Update rge driver for 64 bit kernel.
- stored virtual addresses should be 64bit - physical memory can be directly accessed using XKPHYS pointers in 64 bit. - no need to enable KX
Diffstat (limited to 'sys/mips')
-rw-r--r--sys/mips/rmi/dev/xlr/rge.c48
1 files changed, 34 insertions, 14 deletions
diff --git a/sys/mips/rmi/dev/xlr/rge.c b/sys/mips/rmi/dev/xlr/rge.c
index d3ff482..979543b 100644
--- a/sys/mips/rmi/dev/xlr/rge.c
+++ b/sys/mips/rmi/dev/xlr/rge.c
@@ -567,8 +567,8 @@ build_frag_list(struct mbuf *m_head, struct msgrng_msg *p2p_msg, struct p2d_tx_d
paddr = vtophys((vm_offset_t)tx_desc);
tx_desc->frag[nfrag] = (1ULL << 63) | (fr_stid << 54) | paddr;
nfrag++;
- tx_desc->frag[XLR_MAX_TX_FRAGS] = (uint64_t) (vm_offset_t)tx_desc;
- tx_desc->frag[XLR_MAX_TX_FRAGS + 1] = (uint64_t) (vm_offset_t)m_head;
+ tx_desc->frag[XLR_MAX_TX_FRAGS] = (uint64_t)(intptr_t)tx_desc;
+ tx_desc->frag[XLR_MAX_TX_FRAGS + 1] = (uint64_t)(intptr_t)m_head;
p2d_len = (nfrag * 8);
p2p_msg->msg0 = (1ULL << 63) | (1ULL << 62) | (127ULL << 54) |
@@ -614,19 +614,27 @@ static void
free_buf(vm_paddr_t paddr)
{
struct mbuf *m;
- uint32_t mag, um, sr;
+ uint32_t mag;
+#ifdef __mips_n64
+ uint64_t *vaddr;
+
+ vaddr = (uint64_t *)MIPS_PHYS_TO_XKPHYS_CACHED(paddr);
+ m = (struct mbuf *)vaddr[0];
+ mag = (uint32_t)vaddr[1];
+#else
+ uint32_t sr;
sr = xlr_enable_kx();
- um = xlr_paddr_lw(paddr - XLR_CACHELINE_SIZE);
- mag = xlr_paddr_lw(paddr - XLR_CACHELINE_SIZE + sizeof(uint32_t));
+ m = (struct mbuf *)(intptr_t)xlr_paddr_lw(paddr - XLR_CACHELINE_SIZE + sizeof(uint32_t));
+ mag = xlr_paddr_lw(paddr - XLR_CACHELINE_SIZE + 3 * sizeof(uint32_t));
mips_wr_status(sr);
+#endif
if (mag != 0xf00bad) {
printf("Something is wrong kseg:%lx found mag:%x not 0xf00bad\n",
(u_long)paddr, mag);
return;
}
- m = (struct mbuf *)(intptr_t)um;
if (m != NULL)
m_freem(m);
}
@@ -635,7 +643,7 @@ static void *
get_buf(void)
{
struct mbuf *m_new = NULL;
- unsigned int *md;
+ uint64_t *md;
#ifdef INVARIANTS
vm_paddr_t temp1, temp2;
#endif
@@ -645,7 +653,7 @@ get_buf(void)
return NULL;
m_adj(m_new, XLR_CACHELINE_SIZE - ((uintptr_t)m_new->m_data & 0x1f));
- md = (unsigned int *)m_new->m_data;
+ md = (uint64_t *)m_new->m_data;
md[0] = (uintptr_t)m_new; /* Back Ptr */
md[1] = 0xf00bad;
m_adj(m_new, XLR_CACHELINE_SIZE);
@@ -2033,18 +2041,30 @@ static void
rge_rx(struct rge_softc *sc, vm_paddr_t paddr, int len)
{
struct mbuf *m;
- uint32_t tm, mag, sr;
+ uint32_t mag;
struct ifnet *ifp = sc->rge_ifp;
+#ifdef __mips_n64
+ uint64_t *vaddr;
+ vaddr =(uint64_t *)MIPS_PHYS_TO_XKPHYS_CACHED(paddr - XLR_CACHELINE_SIZE);
+ m = (struct mbuf *)vaddr[0];
+ mag = (uint32_t)vaddr[1];
+#else
+ uint32_t sr;
+ /*
+ * On 32 bit machines we use XKPHYS to get the values stores with
+ * the mbuf, need to explicitly enable KX. Disable interrupts while
+ * KX is enabled to prevent this setting leaking to other code.
+ */
sr = xlr_enable_kx();
- tm = xlr_paddr_lw(paddr - XLR_CACHELINE_SIZE);
- mag = xlr_paddr_lw(paddr - XLR_CACHELINE_SIZE + sizeof(uint32_t));
+ m = (struct mbuf *)(intptr_t)xlr_paddr_lw(paddr - XLR_CACHELINE_SIZE + sizeof(uint32_t));
+ mag = xlr_paddr_lw(paddr - XLR_CACHELINE_SIZE + 3 * sizeof(uint32_t));
mips_wr_status(sr);
-
- m = (struct mbuf *)(intptr_t)tm;
+#endif
if (mag != 0xf00bad) {
/* somebody else packet Error - FIXME in intialization */
- printf("cpu %d: *ERROR* Not my packet paddr %p\n", xlr_cpu_id(), (void *)paddr);
+ printf("cpu %d: *ERROR* Not my packet paddr %p\n",
+ xlr_cpu_id(), (void *)paddr);
return;
}
/* align the data */
OpenPOWER on IntegriCloud