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