// Copyright 2016 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.

#ifndef SYSROOT_ZIRCON_DEVICE_INTEL_HDA_H_
#define SYSROOT_ZIRCON_DEVICE_INTEL_HDA_H_

#include <zircon/compiler.h>
#include <zircon/types.h>

// When communicating with an IHDA driver using zx_channel_call, do not use the
// IHDA_INVALID_TRANSACTION_ID as your message's transaction ID.
#define IHDA_INVALID_TRANSACTION_ID ((zx_txid_t)0)

// Invalid Stream ID and Stream TAG.  These values will never be returned as
// part of a successful REQUEST_STREAM response.
#define IHDA_INVALID_STREAM_ID ((uint16_t)0)
#define IHDA_INVALID_STREAM_TAG ((uint8_t)0)

// Size of a register snapshot
#define IHDA_REGISTER_SNAPSHOT_SIZE (8u << 10)

__BEGIN_CDECLS

typedef uint32_t ihda_cmd_t;
#define IHDA_CMD_GET_IDS ((ihda_cmd_t)0x1000)
#define IHDA_CONTROLLER_CMD_SNAPSHOT_REGS ((ihda_cmd_t)0x2000)
#define IHDA_CODEC_SEND_CORB_CMD ((ihda_cmd_t)0x3000)
#define IHDA_CODEC_REQUEST_STREAM ((ihda_cmd_t)0x3001)
#define IHDA_CODEC_RELEASE_STREAM ((ihda_cmd_t)0x3002)
#define IHDA_CODEC_SET_STREAM_FORMAT ((ihda_cmd_t)0x3003)
#define IHDA_NOACK_FLAG ((ihda_cmd_t)0x80000000)
#define IHDA_CODEC_SEND_CORB_CMD_NOACK ((ihda_cmd_t)(IHDA_NOACK_FLAG | IHDA_CODEC_SEND_CORB_CMD))
#define IHDA_CODEC_RELEASE_STREAM_NOACK ((ihda_cmd_t)(IHDA_NOACK_FLAG | IHDA_CODEC_RELEASE_STREAM))

typedef struct ihda_cmd_hdr {
    zx_txid_t transaction_id;
    ihda_cmd_t cmd;
} ihda_cmd_hdr_t;

// IHDA_CONTROLLER_CMD_GET_IDS
typedef struct ihda_get_ids_req {
    ihda_cmd_hdr_t hdr;
} ihda_get_ids_req_t;

typedef struct ihda_get_ids_resp {
    ihda_cmd_hdr_t hdr;
    uint16_t vid;
    uint16_t did;
    uint8_t ihda_vmaj;
    uint8_t ihda_vmin;
    uint8_t rev_id;
    uint8_t step_id;
} ihda_get_ids_resp_t;

// IHDA_CONTROLLER_CMD_SNAPSHOT_REGS,
//
// Note: returns a snapshot of just the primary register file.  Alias registers
// are not included.
//
// TODO(johngro): When we have a way to return a handle to a read-only VMO which
// provides access to the actual PCI registers, do that instead of snapshotting
// and marshaling the result back.
typedef struct ihda_controller_snapshot_regs_req {
    ihda_cmd_hdr_t hdr;
} ihda_controller_snapshot_regs_req_t;

typedef struct ihda_controller_snapshot_regs_resp {
    ihda_cmd_hdr_t hdr;
    uint8_t snapshot[IHDA_REGISTER_SNAPSHOT_SIZE];
} ihda_controller_snapshot_regs_resp_t;

// IHDA_CODEC_SEND_CORB_CMD
//
// TODO(johngro) : minimize thread context switching by allowing more than one
// command to be queued per job.
//
typedef struct ihda_codec_send_corb_cmd_req {
    ihda_cmd_hdr_t hdr;
    uint32_t verb;
    uint16_t nid;
} ihda_codec_send_corb_cmd_req_t;

typedef struct ihda_codec_send_corb_cmd_resp {
    ihda_cmd_hdr_t hdr;
    uint32_t data;
    uint32_t data_ex;
} ihda_codec_send_corb_cmd_resp_t;

// IHDA_CODEC_REQUEST_STREAM
//
typedef struct ihda_codec_request_stream_req {
    ihda_cmd_hdr_t hdr;
    bool input; // true => input, false => output
} ihda_codec_request_stream_req_t;

typedef struct ihda_codec_request_stream_resp {
    ihda_cmd_hdr_t hdr;
    zx_status_t result;
    uint16_t stream_id;
    uint8_t stream_tag;
} ihda_codec_request_stream_resp_t;

// IHDA_CODEC_RELEASE_STREAM
//
typedef struct ihda_codec_release_stream_req {
    ihda_cmd_hdr_t hdr;
    uint16_t stream_id;
} ihda_codec_release_stream_req_t;

typedef struct ihda_codec_release_stream_resp {
    ihda_cmd_hdr_t hdr;
} ihda_codec_release_stream_resp_t;

// IHDA_CODEC_SET_STREAM_FORMAT
//
typedef struct ihda_codec_set_stream_format_req {
    ihda_cmd_hdr_t hdr;
    uint16_t stream_id;
    uint16_t format; // see section 3.7.1
} ihda_codec_set_stream_format_req_t;

typedef struct ihda_codec_set_stream_format_resp {
    ihda_cmd_hdr_t hdr;
} ihda_codec_set_stream_format_resp_t;

__END_CDECLS

#endif  // SYSROOT_ZIRCON_DEVICE_INTEL_HDA_H_
