// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.hardware.intelgpucore;

using zx;

const IMAGE_TYPE_X_TILED uint32 = 1;
const IMAGE_TYPE_Y_LEGACY_TILED uint32 = 2;
const IMAGE_TYPE_YF_TILED uint32 = 3;

@transport("Banjo")
@banjo_layout("ddk-callback")
protocol IntelGpuCoreInterrupt {
    Callback(struct {
        master_interrupt_control uint32;
        timestamp uint64;
    }) -> ();
};

@transport("Banjo")
@banjo_layout("ddk-protocol")
protocol IntelGpuCore {
    /// Reads 16 bits from pci config space; returned in |value_out|.
    ReadPciConfig16(struct {
        addr uint16;
    }) -> (struct {
        s zx.status;
        value uint16;
    });

    /// Maps the given |pci_bar|; address returned in |addr_out|, size in bytes returned in
    /// |size_out|.
    MapPciMmio(struct {
        pci_bar uint32;
    }) -> (struct {
        s zx.status;
        @buffer
        @callee_allocated
        buf vector<uint8>:MAX;
    });

    /// Unmaps the given |pci_bar|.
    UnmapPciMmio(struct {
        pci_bar uint32;
    }) -> (struct {
        s zx.status;
    });

    /// Returns a bus transaction initiator.
    GetPciBti(struct {
        index uint32;
    }) -> (resource struct {
        s zx.status;
        bti zx.handle:BTI;
    });

    /// Registers the given |callback| to be invoked with parameter |data| when an interrupt occurs
    /// matching |interrupt_mask|.
    RegisterInterruptCallback(resource struct {
        callback client_end:IntelGpuCoreInterrupt;
        interrupt_mask uint32;
    }) -> (struct {
        s zx.status;
    });

    /// Un-registers a previously registered interrupt callback.
    UnregisterInterruptCallback() -> (struct {
        s zx.status;
    });

    /// Returns the size of the GTT (global translation table) in bytes.
    GttGetSize() -> (struct {
        size uint64;
    });

    /// Allocates a region of the GTT of the given |page_count|, returning the page-aligned virtual
    /// address in |addr_out|.
    GttAlloc(struct {
        page_count uint64;
    }) -> (struct {
        s zx.status;
        addr uint64;
    });

    /// Frees the GTT allocation given by |addr|.
    GttFree(struct {
        addr uint64;
    }) -> (struct {
        s zx.status;
    });

    /// Clears the page table entries for the GTT allocation given by |addr|.
    GttClear(struct {
        addr uint64;
    }) -> (struct {
        s zx.status;
    });

    /// Inserts page tables entries for the GTT allocation given by |addr| for the vmo represented by
    /// handle |buffer|, at the given |page_offset| and |page_count|. Takes ownership of |buffer|.
    GttInsert(resource struct {
        addr uint64;
        buffer zx.handle:VMO;
        page_offset uint64;
        page_count uint64;
    }) -> (struct {
        s zx.status;
    });
};
