xref: /netbsd-src/sys/arch/ews4800mips/dev/ga.c (revision 9480c51b042e0def8b42fb02329183ed5bbec874)
1*9480c51bScegger /*	$NetBSD: ga.c,v 1.5 2009/11/07 07:27:43 cegger Exp $	*/
204faabf0Stsutsui 
304faabf0Stsutsui /*-
404faabf0Stsutsui  * Copyright (c) 2004, 2005 The NetBSD Foundation, Inc.
504faabf0Stsutsui  * All rights reserved.
604faabf0Stsutsui  *
704faabf0Stsutsui  * This code is derived from software contributed to The NetBSD Foundation
804faabf0Stsutsui  * by UCHIYAMA Yasushi.
904faabf0Stsutsui  *
1004faabf0Stsutsui  * Redistribution and use in source and binary forms, with or without
1104faabf0Stsutsui  * modification, are permitted provided that the following conditions
1204faabf0Stsutsui  * are met:
1304faabf0Stsutsui  * 1. Redistributions of source code must retain the above copyright
1404faabf0Stsutsui  *    notice, this list of conditions and the following disclaimer.
1504faabf0Stsutsui  * 2. Redistributions in binary form must reproduce the above copyright
1604faabf0Stsutsui  *    notice, this list of conditions and the following disclaimer in the
1704faabf0Stsutsui  *    documentation and/or other materials provided with the distribution.
1804faabf0Stsutsui  *
1904faabf0Stsutsui  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
2004faabf0Stsutsui  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
2104faabf0Stsutsui  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
2204faabf0Stsutsui  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
2304faabf0Stsutsui  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2404faabf0Stsutsui  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2504faabf0Stsutsui  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2604faabf0Stsutsui  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2704faabf0Stsutsui  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2804faabf0Stsutsui  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
2904faabf0Stsutsui  * POSSIBILITY OF SUCH DAMAGE.
3004faabf0Stsutsui  */
3104faabf0Stsutsui 
3204faabf0Stsutsui /* Graphic Adaptor  (350, 360) */
3304faabf0Stsutsui 
3404faabf0Stsutsui #include <sys/cdefs.h>
35*9480c51bScegger __KERNEL_RCSID(0, "$NetBSD: ga.c,v 1.5 2009/11/07 07:27:43 cegger Exp $");
3604faabf0Stsutsui 
3704faabf0Stsutsui #include <sys/param.h>
3804faabf0Stsutsui #include <sys/systm.h>
3904faabf0Stsutsui 
4004faabf0Stsutsui #ifdef _STANDALONE
4104faabf0Stsutsui #include <lib/libsa/stand.h>
4204faabf0Stsutsui #include <lib/libkern/libkern.h>
4304faabf0Stsutsui #include "local.h"
4404faabf0Stsutsui #endif
4504faabf0Stsutsui #ifdef _KERNEL
4604faabf0Stsutsui #include <uvm/uvm_extern.h>
4704faabf0Stsutsui #include <machine/vmparam.h>
4804faabf0Stsutsui #endif
4904faabf0Stsutsui #include <machine/gareg.h>
5004faabf0Stsutsui #include <machine/gavar.h>
5104faabf0Stsutsui 
52712239e3Sthorpej bool ga_map(struct ga *);
5304faabf0Stsutsui void ga_clut_init(struct ga *);
5404faabf0Stsutsui void ga_vblank_start(const struct ga *);
5504faabf0Stsutsui void ga_bt463_reg(const struct ga *, int);
5604faabf0Stsutsui void ga_bt463_data(const struct ga *, int);
5704faabf0Stsutsui void ga_bt463_reg_data(const struct ga *, int, int);
5804faabf0Stsutsui #ifdef _STANDALONE
5904faabf0Stsutsui void ga_dda_busy(const struct ga *);
6004faabf0Stsutsui void ga_ovl_init(const struct ga *);
6104faabf0Stsutsui void ga_id_init(const struct ga *);
6204faabf0Stsutsui void ga_block_clear(const struct ga *);
6304faabf0Stsutsui void ga_plane_mask_test(const struct ga *);
6404faabf0Stsutsui #endif
6504faabf0Stsutsui 
6604faabf0Stsutsui #define	ga_reg_write(ga, ofs, val)					\
6704faabf0Stsutsui 	(*(volatile uint32_t *)((ga)->reg_addr + (ofs)) = (val))
6804faabf0Stsutsui #define	ga_reg_read(ga, ofs)						\
6904faabf0Stsutsui 	(*(volatile uint32_t *)((ga)->reg_addr + (ofs)))
7004faabf0Stsutsui 
71712239e3Sthorpej bool
ga_init(struct ga * ga)7204faabf0Stsutsui ga_init(struct ga *ga)
7304faabf0Stsutsui {
7404faabf0Stsutsui 	int i;
7504faabf0Stsutsui 
7604faabf0Stsutsui 	/* Map GA register and buffers */
7704faabf0Stsutsui 	if (ga->reg_addr == 0 && ga_map(ga) != 0)
7816ed6645Sthorpej 		return false;
7904faabf0Stsutsui 
8004faabf0Stsutsui 	/* This is 350 GA-ROM initialization sequence. */
8104faabf0Stsutsui 	if (ga->flags == 0x0000) {
8204faabf0Stsutsui 		ga_bt463_reg_data(ga, 0x201, 0x40);
8304faabf0Stsutsui 		ga_bt463_reg_data(ga, 0x202, 0x40);
8404faabf0Stsutsui 		ga_bt463_reg_data(ga, 0x203,
8504faabf0Stsutsui 		    ((ga_reg_read(ga, 0xe00) & 2) << 6) | 0x40);
8604faabf0Stsutsui 	} else if (ga->flags == 0x0001) {
8704faabf0Stsutsui 		ga_bt463_reg_data(ga, 0x201, 0x40);
8804faabf0Stsutsui 		ga_bt463_reg_data(ga, 0x202, 0);
8904faabf0Stsutsui 		ga_bt463_reg_data(ga, 0x203,
9004faabf0Stsutsui 		    ((ga_reg_read(ga, 0xe00) & 2) << 6) | 0x40);
9104faabf0Stsutsui 		ga_bt463_reg_data(ga, 0x204, 0xff);	/* Display ON/OFF ? */
9204faabf0Stsutsui 		ga_bt463_reg_data(ga, 0x206, 0);
9304faabf0Stsutsui 		ga_bt463_reg_data(ga, 0x20a, 0);
9404faabf0Stsutsui 	}
9504faabf0Stsutsui 
9604faabf0Stsutsui 	/* Window type table */
9704faabf0Stsutsui 	ga_bt463_reg(ga, 0x300);
9804faabf0Stsutsui 	for (i = 0; i < 16; i++) {
9904faabf0Stsutsui 		ga_bt463_data(ga, 0x00);
10004faabf0Stsutsui 		ga_bt463_data(ga, 0xe1);
10104faabf0Stsutsui 		ga_bt463_data(ga, 0x01);
10204faabf0Stsutsui 	}
10304faabf0Stsutsui 
10404faabf0Stsutsui 	ga_vblank_start(ga);
10504faabf0Stsutsui 
10604faabf0Stsutsui 	/* ??? */
10704faabf0Stsutsui 	ga_bt463_reg(ga, 0x302);
10804faabf0Stsutsui 	for (i = 0; i < 2; i++) {
10904faabf0Stsutsui 		ga_bt463_data(ga, 0x00);
11004faabf0Stsutsui 		ga_bt463_data(ga, 0xe3);
11104faabf0Stsutsui 		ga_bt463_data(ga, 0x21);
11204faabf0Stsutsui 	}
11304faabf0Stsutsui 
11404faabf0Stsutsui 	/* Read mask P0-P7 */
11504faabf0Stsutsui 	if (ga->flags != 0x0001) {
11604faabf0Stsutsui 		/* TR2A display blinks if this was done.. */
11704faabf0Stsutsui 		ga_bt463_reg(ga, 0x205);
11804faabf0Stsutsui 		for (i = 0; i < 4; i++)
11904faabf0Stsutsui 			ga_bt463_data(ga, 0xff);
12004faabf0Stsutsui 	}
12104faabf0Stsutsui 
12204faabf0Stsutsui 	/* Blink mask P0-P7 */
12304faabf0Stsutsui 	ga_bt463_reg(ga, 0x209);
12404faabf0Stsutsui 	for (i = 0; i < 4; i++)
12504faabf0Stsutsui 		ga_bt463_data(ga, 0x00);
12604faabf0Stsutsui 
12704faabf0Stsutsui 	ga_clut_init(ga);
12804faabf0Stsutsui 
12904faabf0Stsutsui 	/* ??? */
13004faabf0Stsutsui 	ga_bt463_reg(ga, 0x200);
13104faabf0Stsutsui 	for (i = 0; i < 0xff; i++) {
13204faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, 0);
13304faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, 0);
13404faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, 0);
13504faabf0Stsutsui 	}
13604faabf0Stsutsui 
13704faabf0Stsutsui 	if (ga_reg_read(ga, 0xe00) & 2)
13804faabf0Stsutsui 		ga_reg_write(ga, 0xe08, 0x790);	/* 71Hz */
13904faabf0Stsutsui 	else
14004faabf0Stsutsui 		ga_reg_write(ga, 0xe08, 0x670); /* 60Hz */
14104faabf0Stsutsui #ifdef _STANDALONE
14204faabf0Stsutsui 	ga_block_clear(ga);
14304faabf0Stsutsui 	ga_ovl_init(ga);
14404faabf0Stsutsui 	ga_id_init(ga);
14504faabf0Stsutsui #endif
14604faabf0Stsutsui 	/* Cursor RAM clear */
14704faabf0Stsutsui 	ga_reg_write(ga, 0xc90, 0);
14804faabf0Stsutsui 	ga_reg_write(ga, 0xc94, 0);
14904faabf0Stsutsui 	ga_reg_write(ga, 0xca0, 0);
15004faabf0Stsutsui 	ga_reg_write(ga, 0xca4, 0);
15104faabf0Stsutsui 	for (i = 0; i < 512; i++) {
15204faabf0Stsutsui 		ga_reg_write(ga, 0xc98, 0);
15304faabf0Stsutsui 		ga_reg_write(ga, 0xca8, 0);
15404faabf0Stsutsui 	}
15504faabf0Stsutsui 
15616ed6645Sthorpej 	return true;
15704faabf0Stsutsui }
15804faabf0Stsutsui 
159712239e3Sthorpej bool
ga_map(struct ga * ga)16004faabf0Stsutsui ga_map(struct ga *ga)
16104faabf0Stsutsui {
16204faabf0Stsutsui #ifdef _STANDALONE
16304faabf0Stsutsui 	/* IPL maps register region using 16Mpage */
16404faabf0Stsutsui 	ga->reg_addr = GA_REG_ADDR;
16504faabf0Stsutsui #endif
16604faabf0Stsutsui #ifdef _KERNEL
16704faabf0Stsutsui 	paddr_t pa, epa;
16804faabf0Stsutsui 	vaddr_t va, tva;
16904faabf0Stsutsui 
17004faabf0Stsutsui 	pa = (paddr_t)GA_REG_ADDR;
17104faabf0Stsutsui 	epa = pa + GA_REG_SIZE;
17204faabf0Stsutsui 
17304faabf0Stsutsui 	if (!(va = uvm_km_alloc(kernel_map, epa - pa, 0, UVM_KMF_VAONLY))) {
17404faabf0Stsutsui 		printf("can't map GA register.\n");
17516ed6645Sthorpej 		return false;
17604faabf0Stsutsui 	}
17704faabf0Stsutsui 
17804faabf0Stsutsui 	for (tva = va; pa < epa; pa += PAGE_SIZE, tva += PAGE_SIZE)
179*9480c51bScegger 		pmap_kenter_pa(tva, pa, VM_PROT_READ | VM_PROT_WRITE, 0);
18004faabf0Stsutsui 
18104faabf0Stsutsui 	pmap_update(pmap_kernel());
18204faabf0Stsutsui 
18304faabf0Stsutsui 	ga->reg_addr = (uint32_t)va;
18404faabf0Stsutsui #endif
18504faabf0Stsutsui 
18616ed6645Sthorpej 	return true;
18704faabf0Stsutsui }
18804faabf0Stsutsui 
18904faabf0Stsutsui void
ga_vblank_start(const struct ga * ga)19004faabf0Stsutsui ga_vblank_start(const struct ga *ga)
19104faabf0Stsutsui {
19204faabf0Stsutsui 
19304faabf0Stsutsui 	while ((ga_reg_read(ga, 0xe00) & 0x1) == 0)	/* V-blank */
19404faabf0Stsutsui 		;
19504faabf0Stsutsui 	while ((ga_reg_read(ga, 0xe00) & 0x1) == 1)
19604faabf0Stsutsui 		;
19704faabf0Stsutsui 	/* V-blank start */
19804faabf0Stsutsui }
19904faabf0Stsutsui 
20004faabf0Stsutsui /* Bt463 utils */
20104faabf0Stsutsui void
ga_bt463_reg(const struct ga * ga,int r)20204faabf0Stsutsui ga_bt463_reg(const struct ga *ga, int r)
20304faabf0Stsutsui {
20404faabf0Stsutsui 
20504faabf0Stsutsui 	ga_reg_write(ga, 0xc80, r & 0xff);
20604faabf0Stsutsui 	ga_reg_write(ga, 0xc84, (r >> 8) & 0xff);
20704faabf0Stsutsui }
20804faabf0Stsutsui 
20904faabf0Stsutsui void
ga_bt463_data(const struct ga * ga,int v)21004faabf0Stsutsui ga_bt463_data(const struct ga *ga, int v)
21104faabf0Stsutsui {
21204faabf0Stsutsui 
21304faabf0Stsutsui 	ga_reg_write(ga, 0xc88, v & 0xff);
21404faabf0Stsutsui }
21504faabf0Stsutsui 
21604faabf0Stsutsui void
ga_bt463_reg_data(const struct ga * ga,int r,int v)21704faabf0Stsutsui ga_bt463_reg_data(const struct ga *ga, int r, int v)
21804faabf0Stsutsui {
21904faabf0Stsutsui 
22004faabf0Stsutsui 	ga_bt463_reg(ga, r);
22104faabf0Stsutsui 	ga_bt463_data(ga, v);
22204faabf0Stsutsui }
22304faabf0Stsutsui 
22404faabf0Stsutsui /* CLUT */
22504faabf0Stsutsui void
ga_clut_init(struct ga * ga)22604faabf0Stsutsui ga_clut_init(struct ga *ga)
22704faabf0Stsutsui {
22804faabf0Stsutsui 	const uint8_t compo6[6] = { 0, 51, 102, 153, 204, 255 };
22904faabf0Stsutsui 	const uint8_t ansi_color[16][3] = {
23004faabf0Stsutsui 		{ 0x00, 0x00, 0x00 },
23104faabf0Stsutsui 		{ 0xff, 0x00, 0x00 },
23204faabf0Stsutsui 		{ 0x00, 0xff, 0x00 },
23304faabf0Stsutsui 		{ 0xff, 0xff, 0x00 },
23404faabf0Stsutsui 		{ 0x00, 0x00, 0xff },
23504faabf0Stsutsui 		{ 0xff, 0x00, 0xff },
23604faabf0Stsutsui 		{ 0x00, 0xff, 0xff },
23704faabf0Stsutsui 		{ 0xff, 0xff, 0xff },
23804faabf0Stsutsui 		{ 0x00, 0x00, 0x00 },
23904faabf0Stsutsui 		{ 0x80, 0x00, 0x00 },
24004faabf0Stsutsui 		{ 0x00, 0x80, 0x00 },
24104faabf0Stsutsui 		{ 0x80, 0x80, 0x00 },
24204faabf0Stsutsui 		{ 0x00, 0x00, 0x80 },
24304faabf0Stsutsui 		{ 0x80, 0x00, 0x80 },
24404faabf0Stsutsui 		{ 0x00, 0x80, 0x80 },
24504faabf0Stsutsui 		{ 0x80, 0x80, 0x80 },
24604faabf0Stsutsui 	};
24704faabf0Stsutsui 	int i, j, r, g, b;
24804faabf0Stsutsui 
24904faabf0Stsutsui 	ga_bt463_reg(ga, 0);
25004faabf0Stsutsui 	/* ANSI escape sequence */
25104faabf0Stsutsui 	for (i = 0; i < 16; i++) {
25204faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, ga->clut[i][0] = ansi_color[i][0]);
25304faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, ga->clut[i][1] = ansi_color[i][1]);
25404faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, ga->clut[i][2] = ansi_color[i][2]);
25504faabf0Stsutsui 	}
25604faabf0Stsutsui 
25704faabf0Stsutsui 	/* 16 - 31, gray scale */
25804faabf0Stsutsui 	for ( ; i < 32; i++) {
25904faabf0Stsutsui 		j = (i - 16) * 17;
26004faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, ga->clut[i][0] = j);
26104faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, ga->clut[i][1] = j);
26204faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, ga->clut[i][2] = j);
26304faabf0Stsutsui 	}
26404faabf0Stsutsui 
26504faabf0Stsutsui 	/* 32 - 247, RGB color */
26604faabf0Stsutsui 	for (r = 0; r < 6; r++) {
26704faabf0Stsutsui 		for (g = 0; g < 6; g++) {
26804faabf0Stsutsui 			for (b = 0; b < 6; b++, i++) {
26904faabf0Stsutsui 				ga_reg_write(ga, 0xc8c,
27004faabf0Stsutsui 				    ga->clut[i][0] = compo6[r]);
27104faabf0Stsutsui 				ga_reg_write(ga, 0xc8c,
27204faabf0Stsutsui 				    ga->clut[i][1] = compo6[g]);
27304faabf0Stsutsui 				ga_reg_write(ga, 0xc8c,
27404faabf0Stsutsui 				    ga->clut[i][2] = compo6[b]);
27504faabf0Stsutsui 			}
27604faabf0Stsutsui 		}
27704faabf0Stsutsui 	}
27804faabf0Stsutsui 
27904faabf0Stsutsui 	/* 248 - 256, white */
28004faabf0Stsutsui 	for ( ; i < 256; i++) {
28104faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, ga->clut[i][0] = 0xff);
28204faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, ga->clut[i][1] = 0xff);
28304faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, ga->clut[i][2] = 0xff);
28404faabf0Stsutsui 	}
28504faabf0Stsutsui 
28604faabf0Stsutsui 	/* 257 - 528, black */
28704faabf0Stsutsui 	for ( ; i < 528; i++) {
28804faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, 0);
28904faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, 0);
29004faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, 0);
29104faabf0Stsutsui 	}
29204faabf0Stsutsui }
29304faabf0Stsutsui 
29404faabf0Stsutsui void
ga_clut_get(struct ga * ga)29504faabf0Stsutsui ga_clut_get(struct ga *ga)
29604faabf0Stsutsui {
29704faabf0Stsutsui 	int i;
29804faabf0Stsutsui 
29904faabf0Stsutsui 	ga_bt463_reg(ga, 0);
30004faabf0Stsutsui 	for (i = 0; i < 256; i++) {
30104faabf0Stsutsui 		ga->clut[i][0] = ga_reg_read(ga, 0xc8c);
30204faabf0Stsutsui 		ga->clut[i][1] = ga_reg_read(ga, 0xc8c);
30304faabf0Stsutsui 		ga->clut[i][2] = ga_reg_read(ga, 0xc8c);
30404faabf0Stsutsui 	}
30504faabf0Stsutsui }
30604faabf0Stsutsui 
30704faabf0Stsutsui void
ga_clut_set(const struct ga * ga)30804faabf0Stsutsui ga_clut_set(const struct ga *ga)
30904faabf0Stsutsui {
31004faabf0Stsutsui 	int i;
31104faabf0Stsutsui 
31204faabf0Stsutsui 	ga_bt463_reg(ga, 0);
31304faabf0Stsutsui 	for (i = 0; i < 256; i++) {
31404faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, ga->clut[i][0]);
31504faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, ga->clut[i][1]);
31604faabf0Stsutsui 		ga_reg_write(ga, 0xc8c, ga->clut[i][2]);
31704faabf0Stsutsui 	}
31804faabf0Stsutsui }
31904faabf0Stsutsui 
32004faabf0Stsutsui /* Not yet analyzed. */
32104faabf0Stsutsui #ifdef _STANDALONE
32204faabf0Stsutsui void
ga_dda_busy(const struct ga * ga)32304faabf0Stsutsui ga_dda_busy(const struct ga *ga)
32404faabf0Stsutsui {
32504faabf0Stsutsui 
32604faabf0Stsutsui 	while ((ga_reg_read(ga, 0xf00) & 0x8000) == 0)
32704faabf0Stsutsui 		;
32804faabf0Stsutsui }
32904faabf0Stsutsui 
33004faabf0Stsutsui void
ga_ovl_init(const struct ga * ga)33104faabf0Stsutsui ga_ovl_init(const struct ga *ga)
33204faabf0Stsutsui {
33304faabf0Stsutsui 	uint32_t *p0, *p1;
33404faabf0Stsutsui 
33504faabf0Stsutsui 	ga_reg_write(ga, 0x400, 0xffffffff);
33604faabf0Stsutsui 	p0 = (uint32_t *)0xf2000000;
33704faabf0Stsutsui 	p1 = (uint32_t *)0xf2200000;
33804faabf0Stsutsui 	while (p0 < p1)
33904faabf0Stsutsui 		*p0++ = 0;
34004faabf0Stsutsui }
34104faabf0Stsutsui 
34204faabf0Stsutsui void
ga_id_init(const struct ga * ga)34304faabf0Stsutsui ga_id_init(const struct ga *ga)
34404faabf0Stsutsui {
34504faabf0Stsutsui 	uint32_t *p0, *p1;
34604faabf0Stsutsui 
34704faabf0Stsutsui 	p0 = (uint32_t *)0xf3000000;
34804faabf0Stsutsui 	p1 = (uint32_t *)0xf3040000;
34904faabf0Stsutsui 	while (p0 < p1)
35004faabf0Stsutsui 		*p0++ = 0;
35104faabf0Stsutsui }
35204faabf0Stsutsui 
35304faabf0Stsutsui void
ga_block_clear(const struct ga * ga)35404faabf0Stsutsui ga_block_clear(const struct ga *ga)
35504faabf0Stsutsui {
35604faabf0Stsutsui 	uint32_t *p0, *p1;
35704faabf0Stsutsui 
35804faabf0Stsutsui 	ga_reg_write(ga, 0xe80, 0);
35904faabf0Stsutsui 	ga_reg_write(ga, 0x400, 0xffffff);
36004faabf0Stsutsui 
36104faabf0Stsutsui 	p0 = (uint32_t *)0xf0c00000;
36204faabf0Stsutsui 	p1 = (uint32_t *)0xf0c80000;
36304faabf0Stsutsui 	while (p0 < p1)
36404faabf0Stsutsui 		*p0++ = 0xffffffff;
36504faabf0Stsutsui }
36604faabf0Stsutsui 
36704faabf0Stsutsui void
ga_plane_mask_test(const struct ga * ga)36804faabf0Stsutsui ga_plane_mask_test(const struct ga *ga)
36904faabf0Stsutsui {
37004faabf0Stsutsui 	int i;
37104faabf0Stsutsui 
37204faabf0Stsutsui 	ga_reg_write(ga, 0x400, 0xffffff);
37304faabf0Stsutsui 	*(volatile uint32_t *)0xf1000000 = 0;
37404faabf0Stsutsui 
37504faabf0Stsutsui 	ga_reg_write(ga, 0x400, 0xaaaaaa);
37604faabf0Stsutsui 	*(volatile uint32_t *)0xf1000000 = 0xffffff;
37704faabf0Stsutsui 
37804faabf0Stsutsui 	if ((*(volatile uint32_t *)0xf1000000 & 0xffffff) != 0xaaaaaa)
37904faabf0Stsutsui 		goto err;
38004faabf0Stsutsui 	ga_reg_write(ga, 0x400, 0xffffff);
38104faabf0Stsutsui 	*(volatile uint32_t *)0xf1000000 = 0;
38204faabf0Stsutsui 
38304faabf0Stsutsui 
38404faabf0Stsutsui 	*(volatile uint32_t *)0xf1080008 = 0;
38504faabf0Stsutsui 	ga_reg_write(ga, 0x400, 0x555555);
38604faabf0Stsutsui 	*(volatile uint32_t *)0xf1080008 = 0xffffff;
38704faabf0Stsutsui 	if ((*(volatile uint32_t *)0xf1080008 & 0xffffff) != 0x555555)
38804faabf0Stsutsui 		goto err;
38904faabf0Stsutsui 	ga_reg_write(ga, 0x400, 0xffffff);
39004faabf0Stsutsui 	*(volatile uint32_t *)0xf1080008 = 0;
39104faabf0Stsutsui 
39204faabf0Stsutsui 	*(volatile uint32_t *)0xf1100000 = 0;
39304faabf0Stsutsui 	*(volatile uint32_t *)0xf1100000 = 0xffffff;
39404faabf0Stsutsui 	if ((*(volatile uint32_t *)0xf1100000 & 0xffffff) != 0xffffff)
39504faabf0Stsutsui 		goto err;
39604faabf0Stsutsui 
39704faabf0Stsutsui 	ga_reg_write(ga, 0x400, 0xaaaaaa);
39804faabf0Stsutsui 	*(volatile uint32_t *)0xf1100000 = 0;
39904faabf0Stsutsui 	if ((*(volatile uint32_t *)0xf1100000 & 0xffffff) != 0x555555)
40004faabf0Stsutsui 		goto err;
40104faabf0Stsutsui 
40204faabf0Stsutsui 	ga_reg_write(ga, 0x400, 0);
40304faabf0Stsutsui 	*(volatile uint32_t *)0xf1100000 = 0xffffff;
40404faabf0Stsutsui 	if ((*(volatile uint32_t *)0xf1100000 & 0xffffff) != 0x555555)
40504faabf0Stsutsui 		goto err;
40604faabf0Stsutsui 
40704faabf0Stsutsui 	ga_reg_write(ga, 0x400, 0xffffff);
40804faabf0Stsutsui 	*(volatile uint32_t *)0xf1100000 = 0;
40904faabf0Stsutsui 
41004faabf0Stsutsui 	ga_reg_write(ga, 0xe80, 0xffffff);
41104faabf0Stsutsui 	ga_reg_write(ga, 0x400, 0xffffff);
41204faabf0Stsutsui 	*(volatile uint32_t *)0xf0c00000 = 0xffffffff;
41304faabf0Stsutsui 	for (i = 0; i < 32; i++)
41404faabf0Stsutsui 		if ((*(volatile uint32_t *)(0xf1000000 + i * 4) & 0xffffff) !=
41504faabf0Stsutsui 		    0xffffff)
41604faabf0Stsutsui 			goto err;
41704faabf0Stsutsui 
41804faabf0Stsutsui 	ga_reg_write(ga, 0xe80, 0);
41904faabf0Stsutsui 	ga_reg_write(ga, 0x400, 0xaaaaaa);
42004faabf0Stsutsui 	*(volatile uint32_t *)0xf0c00000 = 0xffffffff;
42104faabf0Stsutsui 	for (i = 0; i < 32; i++)
42204faabf0Stsutsui 		if ((*(volatile uint32_t *)(0xf1000000 + i * 4) & 0xffffff) !=
42304faabf0Stsutsui 		    0x555555)
42404faabf0Stsutsui 			goto err;
42504faabf0Stsutsui 	ga_reg_write(ga, 0x400, 0x555555);
42604faabf0Stsutsui 	*(volatile uint32_t *)0xf0c00000 = 0xffffffff;
42704faabf0Stsutsui 	for (i = 0; i < 32; i++)
42804faabf0Stsutsui 		if ((*(volatile uint32_t *)(0xf1000000 + i * 4) & 0xffffff) !=
42904faabf0Stsutsui 		    0x0)
43004faabf0Stsutsui 			goto err;
43104faabf0Stsutsui 
43204faabf0Stsutsui 	printf("SUCCESS\n");
43304faabf0Stsutsui 	return;
43404faabf0Stsutsui  err:
43504faabf0Stsutsui 	printf("ERROR\n");
43604faabf0Stsutsui }
43704faabf0Stsutsui #endif /* _STANDALONE */
438