<?xml version="1.0" encoding="UTF-8"?>
<database xmlns="http://nouveau.freedesktop.org/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://nouveau.freedesktop.org/ rules-ng.xsd">

<!--
	Pipe registers are a special kind of registers used by SQE on a6xxx, and
	on a5xx by the ME, to control the CP. They only exist inside the CP, can
	only be written to, and use the high 8 bits of the $addr register. For
	example, this is how CP_WAIT_MEM_WRITES is implemented on a6xx:

CP_WAIT_MEM_WRITES:
	053b: 8b1d0084	mov $addr, 0x0084 << 24
	053c: d8000000	waitin
	053d: 981f0806	mov $01, $data

	and on a5xx ME:

CP_WAIT_MEM_WRITES:
	05c3: 8b1d00c4	mov $addr, 0x00c4 << 24
	05c4: d8000000	waitin
	05c5: 981f0806	mov $01, $data

	This writes to pipe register 0x84, or 0xc4 on a5xx. In this case the
	value written is ignored, but for other registers it isn't.

	Note that on a6xx, pipe register writes are pipelined together with
	regular register writes in what replaced the MEQ.
-->

<bitset name="void" inline="yes">
	<doc>Special type to mark registers with no payload.</doc>
</bitset>

<domain name="A5XX_PIPE_REG" width="32">
</domain>

<domain name="A6XX_PIPE_REG" width="32">
	<!-- This replaces CP_WFI_PEND_CTR on a3xx-a5xx -->
	<reg32 name="WFI_PEND_DECR" offset="0x81" type="void"/>
	<!-- This is only used for WRITE_PRIMITIVE_COUNTS/ZPASS_DONE events -->
	<reg32 name="QUERY_PEND_DECR" offset="0x82" type="void"/>
	<reg32 name="WAIT_MEM_WRITES" offset="0x84" type="void"/>

	<!-- Replaces CP_ME_NRT_ADDR/DATA on a3xx-a5xx -->
	<reg64 name="NRT_ADDR" offset="0xa0"/>
	<reg32 name="NRT_DATA" offset="0xa2"/>

	<reg32 name="EVENT_CMD" offset="0xe7">
		<enum name="a6xx_event_type">
			<value value="0" name="UNK_EVENT"/> <!-- sometimes used with binning draws? -->
			<value value="1" name="EVENT"/>
			<value value="2" name="DRAW"/>
			<value value="3" name="DISPATCH"/>
		</enum>
		<bitfield name="EVENT_TYPE" low="0" high="1" type="a6xx_event_type"/>
		<!-- set for all *_TS events (i.e. ones that write something) -->
		<bitfield name="TS_WRITE" pos="2" type="boolean"/>
		<!-- Decrement CACHE_FLUSH_PEND_CTR when event happens -->
		<bitfield name="CACHE_FLUSH_PEND_DECR" pos="3" type="boolean"/>
	</reg32>
	<reg64 name="EVENT_TS_ADDR" offset="0xe8"/>
	<reg32 name="EVENT_TS_CTRL" offset="0xea">
		<bitfield name="TIMESTAMP" pos="1" type="boolean"/>
		<bitfield name="INTERRUPT" pos="2" type="boolean"/>
		<enum name="a6xx_ts_event">
			<value value="1" name="CACHE_FLUSH"/>
			<value value="2" name="WT_DONE"/>
			<value value="3" name="RB_DONE"/>
			<value value="4" name="CCU_FLUSH_DEPTH"/>
			<value value="5" name="CCU_FLUSH_COLOR"/>
			<value value="6" name="CCU_RESOLVE"/>
		</enum>
		<bitfield name="EVENT" low="8" high="10" type="a6xx_ts_event"/>
	</reg32>
	<!-- data to write when !EVENT_TS_CTRL::TIMESTAMP -->
	<reg32 name="EVENT_TS_DATA" offset="0xeb"/>
</domain>

</database>
