1/*
2	Copyright (c) 2003, Thomas Kurschel
3
4
5	Part of Radeon accelerant
6
7	Kernel driver wrapper
8*/
9
10#include "radeon_accelerant.h"
11#include <sys/ioctl.h>
12#include "rbbm_regs.h"
13#include "mmio.h"
14
15
16status_t Radeon_WaitForIdle( accelerator_info *ai, bool keep_lock )
17{
18	radeon_wait_for_idle wfi;
19
20	wfi.magic = RADEON_PRIVATE_DATA_MAGIC;
21	wfi.keep_lock = keep_lock;
22
23	return ioctl( ai->fd, RADEON_WAITFORIDLE, &wfi, sizeof( wfi ));
24}
25
26// wait until "entries" FIFO entries are empty
27// lock must be hold
28status_t Radeon_WaitForFifo( accelerator_info *ai, int entries )
29{
30	while( 1 ) {
31		bigtime_t start_time = system_time();
32
33		do {
34			int slots = INREG( ai->regs, RADEON_RBBM_STATUS ) & RADEON_RBBM_FIFOCNT_MASK;
35
36			if ( slots >= entries )
37				return B_OK;
38
39			snooze( 1 );
40		} while( system_time() - start_time < 1000000 );
41
42		Radeon_ResetEngine( ai );
43	}
44
45	return B_ERROR;
46}
47
48void Radeon_ResetEngine( accelerator_info *ai )
49{
50	radeon_no_arg na;
51
52	na.magic = RADEON_PRIVATE_DATA_MAGIC;
53
54	ioctl( ai->fd, RADEON_RESETENGINE, &na, sizeof( na ));
55}
56
57
58status_t Radeon_VIPRead( accelerator_info *ai, uint channel, uint address, uint32 *data )
59{
60	radeon_vip_read vr;
61	status_t res;
62
63	vr.magic = RADEON_PRIVATE_DATA_MAGIC;
64	vr.channel = channel;
65	vr.address = address;
66	vr.lock = false;
67
68	res = ioctl( ai->fd, RADEON_VIPREAD, &vr, sizeof( vr ));
69
70	if( res == B_OK )
71		*data = vr.data;
72
73	return res;
74}
75
76
77status_t Radeon_VIPWrite( accelerator_info *ai, uint8 channel, uint address, uint32 data )
78{
79	radeon_vip_write vw;
80
81	vw.magic = RADEON_PRIVATE_DATA_MAGIC;
82	vw.channel = channel;
83	vw.address = address;
84	vw.data = data;
85	vw.lock = false;
86
87	return ioctl( ai->fd, RADEON_VIPWRITE, &vw, sizeof( vw ));
88}
89
90int Radeon_FindVIPDevice( accelerator_info *ai, uint32 device_id )
91{
92	radeon_find_vip_device fvd;
93	status_t res;
94
95	fvd.magic = RADEON_PRIVATE_DATA_MAGIC;
96	fvd.device_id = device_id;
97
98	res = ioctl( ai->fd, RADEON_FINDVIPDEVICE, &fvd, sizeof( fvd ));
99
100	if( res == B_OK )
101		return fvd.channel;
102	else
103		return -1;
104}
105