110915Sandreas.sandberg@arm.com/*
210915Sandreas.sandberg@arm.com * Copyright (c) 2014-2015 ARM Limited
310915Sandreas.sandberg@arm.com * All rights reserved
410915Sandreas.sandberg@arm.com *
510915Sandreas.sandberg@arm.com * Licensed under the Apache License, Version 2.0 (the "License");
610915Sandreas.sandberg@arm.com * you may not use this file except in compliance with the License.
710915Sandreas.sandberg@arm.com * You may obtain a copy of the License at
810915Sandreas.sandberg@arm.com *
910915Sandreas.sandberg@arm.com *     http://www.apache.org/licenses/LICENSE-2.0
1010915Sandreas.sandberg@arm.com *
1110915Sandreas.sandberg@arm.com * Unless required by applicable law or agreed to in writing, software
1210915Sandreas.sandberg@arm.com * distributed under the License is distributed on an "AS IS" BASIS,
1310915Sandreas.sandberg@arm.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1410915Sandreas.sandberg@arm.com * See the License for the specific language governing permissions and
1510915Sandreas.sandberg@arm.com * limitations under the License.
1610915Sandreas.sandberg@arm.com *
1710915Sandreas.sandberg@arm.com * Authors: Andreas Sandberg
1810915Sandreas.sandberg@arm.com */
1910915Sandreas.sandberg@arm.com
2010915Sandreas.sandberg@arm.com#include <libnomali/nomali.h>
2110915Sandreas.sandberg@arm.com#include <inttypes.h>
2210915Sandreas.sandberg@arm.com
2310915Sandreas.sandberg@arm.com#include "nomali_test_helpers.h"
2410915Sandreas.sandberg@arm.com#include "../lib/mali_midg_regmap.h"
2510915Sandreas.sandberg@arm.com
2610915Sandreas.sandberg@arm.comstatic void
2710915Sandreas.sandberg@arm.comon_int(nomali_handle_t h, void *usr, nomali_int_t intno, int set)
2810915Sandreas.sandberg@arm.com{
2910915Sandreas.sandberg@arm.com    test_diag("on_int: intno: %i, set: %i", intno, set);
3010915Sandreas.sandberg@arm.com    *(int*)usr = !!set;
3110915Sandreas.sandberg@arm.com}
3210915Sandreas.sandberg@arm.com
3310915Sandreas.sandberg@arm.comstatic void
3410915Sandreas.sandberg@arm.comtest_gpu_int(nomali_handle_t h)
3510915Sandreas.sandberg@arm.com{
3610915Sandreas.sandberg@arm.com    int int_triggered = 0;
3710915Sandreas.sandberg@arm.com    nomali_callback_t int_callback = {
3810915Sandreas.sandberg@arm.com        .type = NOMALI_CALLBACK_INT,
3910915Sandreas.sandberg@arm.com        .usr = &int_triggered,
4010915Sandreas.sandberg@arm.com        .func.interrupt = on_int,
4110915Sandreas.sandberg@arm.com    };
4210915Sandreas.sandberg@arm.com
4310915Sandreas.sandberg@arm.com    nomali_callback_t int_null_callback = {
4410915Sandreas.sandberg@arm.com        .type = NOMALI_CALLBACK_INT,
4510915Sandreas.sandberg@arm.com        .usr = NULL,
4610915Sandreas.sandberg@arm.com        .func.interrupt = NULL,
4710915Sandreas.sandberg@arm.com    };
4810915Sandreas.sandberg@arm.com
4910915Sandreas.sandberg@arm.com    /*
5010915Sandreas.sandberg@arm.com     * Raise an interrupt without callbacks
5110915Sandreas.sandberg@arm.com     */
5210915Sandreas.sandberg@arm.com    E_NOMALI_BAIL(nomali_reg_write(h,
5310915Sandreas.sandberg@arm.com                                   GPU_CONTROL_REG(GPU_IRQ_CLEAR),
5410915Sandreas.sandberg@arm.com                                   GPU_IRQ_REG_ALL));
5510915Sandreas.sandberg@arm.com
5610915Sandreas.sandberg@arm.com    E_NOMALI_BAIL(nomali_reg_write(h, GPU_CONTROL_REG(GPU_IRQ_MASK),
5710915Sandreas.sandberg@arm.com                                   GPU_FAULT));
5810915Sandreas.sandberg@arm.com
5910915Sandreas.sandberg@arm.com    E_NOMALI_BAIL(nomali_reg_write(h, GPU_CONTROL_REG(GPU_IRQ_RAWSTAT),
6010915Sandreas.sandberg@arm.com                                   GPU_FAULT));
6110915Sandreas.sandberg@arm.com
6210915Sandreas.sandberg@arm.com    E_NOMALI_BAIL(nomali_reg_write(h,
6310915Sandreas.sandberg@arm.com                                   GPU_CONTROL_REG(GPU_IRQ_CLEAR),
6410915Sandreas.sandberg@arm.com                                   GPU_IRQ_REG_ALL));
6510915Sandreas.sandberg@arm.com
6610915Sandreas.sandberg@arm.com    /*
6710915Sandreas.sandberg@arm.com     * Register callbacks and raise interrupt again.
6810915Sandreas.sandberg@arm.com     */
6910915Sandreas.sandberg@arm.com    E_NOMALI_BAIL(nomali_set_callback(h, &int_callback));
7010915Sandreas.sandberg@arm.com    if (int_triggered != 0) {
7110915Sandreas.sandberg@arm.com        test_diag("Got spurious interrupt\n");
7210915Sandreas.sandberg@arm.com        test_fail("gpu_int");
7310915Sandreas.sandberg@arm.com    }
7410915Sandreas.sandberg@arm.com
7510915Sandreas.sandberg@arm.com    E_NOMALI_BAIL(nomali_reg_write(h, GPU_CONTROL_REG(GPU_IRQ_RAWSTAT),
7610915Sandreas.sandberg@arm.com                                   GPU_FAULT));
7710915Sandreas.sandberg@arm.com    if (int_triggered == 1) {
7810915Sandreas.sandberg@arm.com        test_ok("gpu_int");
7910915Sandreas.sandberg@arm.com    } else {
8010915Sandreas.sandberg@arm.com        test_fail("gpu_int");
8110915Sandreas.sandberg@arm.com    }
8210915Sandreas.sandberg@arm.com    int_triggered = 0;
8310915Sandreas.sandberg@arm.com
8410915Sandreas.sandberg@arm.com
8510915Sandreas.sandberg@arm.com    /*
8610915Sandreas.sandberg@arm.com     * Register mask interrupts and raise interrupt again.
8710915Sandreas.sandberg@arm.com     */
8810915Sandreas.sandberg@arm.com    E_NOMALI_BAIL(nomali_reg_write(h,
8910915Sandreas.sandberg@arm.com                                   GPU_CONTROL_REG(GPU_IRQ_CLEAR),
9010915Sandreas.sandberg@arm.com                                   GPU_IRQ_REG_ALL));
9110915Sandreas.sandberg@arm.com    E_NOMALI_BAIL(nomali_reg_write(h, GPU_CONTROL_REG(GPU_IRQ_MASK),
9210915Sandreas.sandberg@arm.com                                   0));
9310915Sandreas.sandberg@arm.com    E_NOMALI_BAIL(nomali_reg_write(h, GPU_CONTROL_REG(GPU_IRQ_RAWSTAT),
9410915Sandreas.sandberg@arm.com                                   GPU_FAULT));
9510915Sandreas.sandberg@arm.com    if (int_triggered == 0) {
9610915Sandreas.sandberg@arm.com        test_ok("gpu_int_masked");
9710915Sandreas.sandberg@arm.com    } else {
9810915Sandreas.sandberg@arm.com        test_fail("gpu_int_maked");
9910915Sandreas.sandberg@arm.com    }
10010915Sandreas.sandberg@arm.com    E_NOMALI_BAIL(nomali_reg_write(h,
10110915Sandreas.sandberg@arm.com                                   GPU_CONTROL_REG(GPU_IRQ_CLEAR),
10210915Sandreas.sandberg@arm.com                                   GPU_IRQ_REG_ALL));
10310915Sandreas.sandberg@arm.com    E_NOMALI_BAIL(nomali_set_callback(h, &int_null_callback));
10410915Sandreas.sandberg@arm.com}
10510915Sandreas.sandberg@arm.com
10610915Sandreas.sandberg@arm.comint
10710915Sandreas.sandberg@arm.commain(int argc, char **argv)
10810915Sandreas.sandberg@arm.com{
10910915Sandreas.sandberg@arm.com    const nomali_config_t cfg = {
11010915Sandreas.sandberg@arm.com        .type = NOMALI_GPU_T60X,
11110915Sandreas.sandberg@arm.com        .ver_maj = 0,
11210915Sandreas.sandberg@arm.com        .ver_min = 1,
11310915Sandreas.sandberg@arm.com        .ver_status = 0,
11410915Sandreas.sandberg@arm.com    };
11510915Sandreas.sandberg@arm.com
11610915Sandreas.sandberg@arm.com    nomali_handle_t h;
11710915Sandreas.sandberg@arm.com
11810915Sandreas.sandberg@arm.com    E_NOMALI_BAIL(nomali_create(&h, &cfg));
11910915Sandreas.sandberg@arm.com
12010915Sandreas.sandberg@arm.com    test_gpu_int(h);
12110915Sandreas.sandberg@arm.com
12210915Sandreas.sandberg@arm.com    E_NOMALI_BAIL(nomali_destroy(h));
12310915Sandreas.sandberg@arm.com
12410915Sandreas.sandberg@arm.com    return 0;
12510915Sandreas.sandberg@arm.com}
126