#ifndef _CN30XXFPAVAR_H_
#define _CN30XXFPAVAR_H_
struct cn30xxfpa_buf {
int fb_poolno;
size_t fb_size;
size_t fb_nelems;
paddr_t fb_paddr;
vaddr_t fb_addr;
size_t fb_len;
bus_dma_tag_t fb_dmat;
bus_dmamap_t fb_dmah;
bus_dma_segment_t
*fb_dma_segs;
int fb_dma_nsegs;
};
int cn30xxfpa_buf_init(int, size_t, size_t, struct cn30xxfpa_buf **);
void *cn30xxfpa_buf_get(struct cn30xxfpa_buf *);
uint64_t cn30xxfpa_query(int);
static inline uint64_t
cn30xxfpa_load(uint64_t fpapool)
{
uint64_t addr;
addr =
(0x1ULL << 48) |
(0x5ULL << 43) |
(fpapool & 0x07ULL) << 40;
return octeon_xkphys_read_8(addr);
}
#ifdef notyet
static inline uint64_t
cn30xxfpa_iobdma(struct cn30xxfpa_softc *sc, int srcaddr, int len)
{
return 0ULL;
}
#endif
static inline void
cn30xxfpa_store(uint64_t addr, uint64_t fpapool, uint64_t dwbcount)
{
uint64_t ptr;
ptr =
(0x1ULL << 48) |
(0x5ULL << 43) |
(fpapool & 0x07ULL) << 40 |
(addr & 0xffffffffffULL);
mips_sync();
octeon_xkphys_write_8(ptr, (dwbcount & 0x0ffULL));
}
static inline paddr_t
cn30xxfpa_buf_get_paddr(struct cn30xxfpa_buf *fb)
{
return cn30xxfpa_load(fb->fb_poolno);
}
static inline void
cn30xxfpa_buf_put_paddr(struct cn30xxfpa_buf *fb, paddr_t paddr)
{
KASSERT(paddr >= fb->fb_paddr);
KASSERT(paddr < fb->fb_paddr + fb->fb_len);
cn30xxfpa_store(paddr, fb->fb_poolno, fb->fb_size / CACHELINESIZE);
}
static inline void
cn30xxfpa_buf_put(struct cn30xxfpa_buf *fb, void *addr)
{
paddr_t paddr;
KASSERT((vaddr_t)addr >= fb->fb_addr);
KASSERT((vaddr_t)addr < fb->fb_addr + fb->fb_len);
paddr = fb->fb_paddr + (paddr_t)((vaddr_t)addr - fb->fb_addr);
cn30xxfpa_buf_put_paddr(fb, paddr);
}
#endif