blob: 2c1d8f9b77b6874ca62eba1f85efc81f1ea32a01 [file] [log] [blame]
// 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_