blob: 49ef581cdd2dac34286a9d042472afe4507f9a63 [file] [log] [blame]
// Copyright 2023 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.amlogiccanvas;
using zx;
type CanvasFlags = flexible bits : uint32 {
READ = 0b0001;
WRITE = 0b0010;
/// Wrap accesses outside of [0, height).
WRAP_VERTICAL = 0b0100;
/// Wrap accesses outside of [0, width).
WRAP_HORIZONTAL = 0b1000;
};
type CanvasBlockMode = flexible enum : uint32 {
LINEAR = 0x0;
BLOCK_32X32 = 0x1;
BLOCK_64X32 = 0x2;
};
/// Describes the byte ordering ("endianness") in each 128-bit (16-bytes) chunk
/// of pixel data.
///
/// The default byte ordering for canvas images is called "128-bit
/// little-endian". For example, each little-endian chunk in an R8G8B8A8 image
/// contains 4 pixels, laid out as follows:
/// R0, G0, B0, A0, R1, G1, B1, A1, R2, G2, B2, A2, R3, G3, B3, A3.
///
/// Hardware modules may write to the memory interface using different byte
/// orderings. The byte ordering (endianness) is expressed as a sequence of
/// pairwise swaps of all 8/16/32/64-bit sub-chunks in a chunk. These swap
/// operations are commutative, so their ordering does not matter.
///
/// For example, if hardware writes images in 64-bit (8-byte) big-endian,
/// [`SWAP_8BIT_PAIRS`], [`SWAP_16BIT_PAIRS`] and [`SWAP_32BIT_PAIRS`] will be
/// needed:
/// The original bytes written by the hardware:
/// A1, B1, G1, R1, A0, B0, G0, R0, A3, B3, G3, R3, A2, B2, G2, R2,...
/// Swapping every 8-bit pair we get:
/// B1, A1, R1, G1, B0, A0, R0, G0, B3, A3, R3, G3, B2, A2, R2, G2,...
/// Then we swap every 16-bit pair:
/// R1, G1, B1, A1, R0, G0, B0, A0, R3, G3, B3, A3, R2, G2, B2, A2,...
/// Then we swap every 32-bit pair:
/// R0, G0, B0, A0, R1, G1, B1, A1, R2, G2, B2, A2, R3, G3, B3, A3,...
/// to get the correct interpretation.
type CanvasEndianness = flexible bits : uint32 {
// The ordering involves pairwise swaps of all 8-bit sub-chunks.
SWAP_8BIT_PAIRS = 0b0001;
// The ordering involves pairwise swaps of all 16-bit sub-chunks.
SWAP_16BIT_PAIRS = 0b0010;
// The ordering involves pairwise swaps of all 32-bit sub-chunks.
SWAP_32BIT_PAIRS = 0b0100;
// The ordering involves pairwise swaps of all 64-bit sub-chunks.
SWAP_64BIT_PAIRS = 0b1000;
};
/// CanvasInfo corresponds to the DMC_CAV_LUT_DATAL/DATAH registers used to
/// program memory layout and format for a single canvas.
type CanvasInfo = struct {
/// Height in rows.
height uint32;
/// Offset between rows of pixels, in bytes.
stride_bytes uint32;
/// Use a tiled layout if non-zero.
blkmode CanvasBlockMode;
/// Ordering of bytes in each 128-bit (16-byte) chunk of pixel data.
endianness CanvasEndianness;
/// Flags to control access to canvas memory.
flags CanvasFlags;
};
@discoverable
closed protocol Device {
/// Configures a canvas. Canvases are a special construct in the AMLogic
/// memory controller, used to turn image data accesses into memory accesses
/// while respecting block/tiling, stride, and endianness.
///
/// `vmo` is the backing memory to use for this canvas.
/// `offset` is the relative address for image data within `vmo`.
/// `info` describes the canvas layout (see CanvasInfo for details).
strict Config(resource struct {
vmo zx.Handle:VMO;
offset uint64;
info CanvasInfo;
}) -> (struct {
canvas_idx uint8;
}) error zx.Status;
/// Frees up a canvas.
strict Free(struct {
canvas_idx uint8;
}) -> () error zx.Status;
};
service Service {
device client_end:Device;
};