/* $NetBSD: cdio_mmc_structs.h,v 1.2 2022/04/09 10:05:35 riastradh Exp $ */

/*
* Copyright (c) 2006, 2008, 2013 Reinoud Zandijk
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
*    notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
*    notice, this list of conditions and the following disclaimer in the
*    documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
*/

#ifndef _CDIO_MMC_EMU_H_
#define _CDIO_MMC_EMU_H_

#include <sys/types.h>

/*
* MMC device abstraction interface.
*
* It gathers information from GET_CONFIGURATION, READ_DISCINFO,
* READ_TRACKINFO, READ_TOC2, READ_CD_CAPACITY and GET_CONFIGURATION
* SCSI/ATAPI calls regardless if its a legacy CD-ROM/DVD-ROM device or a MMC
* standard recordable device.
*/
struct mmc_discinfo {
       uint16_t        mmc_profile;
       uint16_t        mmc_class;

       uint8_t         disc_state;
       uint8_t         last_session_state;
       uint8_t         bg_format_state;
       uint8_t         link_block_penalty;     /* in sectors              */

       uint64_t        mmc_cur;                /* current MMC_CAPs        */
       uint64_t        mmc_cap;                /* possible MMC_CAPs       */

       uint32_t        disc_flags;             /* misc flags              */

       uint32_t        disc_id;
       uint64_t        disc_barcode;
       uint8_t         application_code;       /* 8 bit really            */

       uint8_t         unused1[3];             /* padding                 */

       uint32_t        last_possible_lba;      /* last leadout start adr. */
       uint32_t        sector_size;

       uint16_t        num_sessions;
       uint16_t        num_tracks;             /* derived */

       uint16_t        first_track;
       uint16_t        first_track_last_session;
       uint16_t        last_track_last_session;

       uint16_t        unused2;                /* padding/misc info resv. */

       uint16_t        reserved1[4];           /* MMC-5 track resources   */
       uint32_t        reserved2[3];           /* MMC-5 POW resources     */

       uint32_t        reserved3[8];           /* MMC-5+ */
};
#define MMCGETDISCINFO  _IOR('c', 28, struct mmc_discinfo)

#define MMC_CLASS_UNKN  0
#define MMC_CLASS_DISC  1
#define MMC_CLASS_CD    2
#define MMC_CLASS_DVD   3
#define MMC_CLASS_MO    4
#define MMC_CLASS_BD    5
#define MMC_CLASS_FILE  0xffff  /* emulation mode */

#define MMC_DFLAGS_BARCODEVALID (1 <<  0)  /* barcode is present and valid   */
#define MMC_DFLAGS_DISCIDVALID  (1 <<  1)  /* discid is present and valid    */
#define MMC_DFLAGS_APPCODEVALID (1 <<  2)  /* application code valid         */
#define MMC_DFLAGS_UNRESTRICTED (1 <<  3)  /* restricted, then set app. code */

#define MMC_DFLAGS_FLAGBITS \
   "\10\1BARCODEVALID\2DISCIDVALID\3APPCODEVALID\4UNRESTRICTED"

#define MMC_CAP_SEQUENTIAL      (1 <<  0)  /* sequential writable only       */
#define MMC_CAP_RECORDABLE      (1 <<  1)  /* record-able; i.e. not static   */
#define MMC_CAP_ERASABLE        (1 <<  2)  /* drive can erase sectors        */
#define MMC_CAP_BLANKABLE       (1 <<  3)  /* media can be blanked           */
#define MMC_CAP_FORMATTABLE     (1 <<  4)  /* media can be formatted         */
#define MMC_CAP_REWRITABLE      (1 <<  5)  /* media can be rewritten         */
#define MMC_CAP_MRW             (1 <<  6)  /* Mount Rainier formatted        */
#define MMC_CAP_PACKET          (1 <<  7)  /* using packet recording         */
#define MMC_CAP_STRICTOVERWRITE (1 <<  8)  /* only writes a packet at a time */
#define MMC_CAP_PSEUDOOVERWRITE (1 <<  9)  /* overwrite through replacement  */
#define MMC_CAP_ZEROLINKBLK     (1 << 10)  /* zero link block length capable */
#define MMC_CAP_HW_DEFECTFREE   (1 << 11)  /* hardware defect management     */

#define MMC_CAP_FLAGBITS \
   "\10\1SEQUENTIAL\2RECORDABLE\3ERASABLE\4BLANKABLE\5FORMATTABLE" \
   "\6REWRITABLE\7MRW\10PACKET\11STRICTOVERWRITE\12PSEUDOOVERWRITE" \
   "\13ZEROLINKBLK\14HW_DEFECTFREE"

#define MMC_STATE_EMPTY         0
#define MMC_STATE_INCOMPLETE    1
#define MMC_STATE_FULL          2
#define MMC_STATE_CLOSED        3

#define MMC_BGFSTATE_UNFORM     0
#define MMC_BGFSTATE_STOPPED    1
#define MMC_BGFSTATE_RUNNING    2
#define MMC_BGFSTATE_COMPLETED  3


struct mmc_trackinfo {
       uint16_t        tracknr;        /* IN/OUT */
       uint16_t        sessionnr;

       uint8_t         track_mode;
       uint8_t         data_mode;

       uint16_t        flags;

       uint32_t        track_start;
       uint32_t        next_writable;
       uint32_t        free_blocks;
       uint32_t        packet_size;
       uint32_t        track_size;
       uint32_t        last_recorded;
};
#define MMCGETTRACKINFO _IOWR('c', 29, struct mmc_trackinfo)

#define MMC_TRACKINFO_COPY              (1 <<  0)
#define MMC_TRACKINFO_DAMAGED           (1 <<  1)
#define MMC_TRACKINFO_FIXED_PACKET      (1 <<  2)
#define MMC_TRACKINFO_INCREMENTAL       (1 <<  3)
#define MMC_TRACKINFO_BLANK             (1 <<  4)
#define MMC_TRACKINFO_RESERVED          (1 <<  5)
#define MMC_TRACKINFO_NWA_VALID         (1 <<  6)
#define MMC_TRACKINFO_LRA_VALID         (1 <<  7)
#define MMC_TRACKINFO_DATA              (1 <<  8)
#define MMC_TRACKINFO_AUDIO             (1 <<  9)
#define MMC_TRACKINFO_AUDIO_4CHAN       (1 << 10)
#define MMC_TRACKINFO_PRE_EMPH          (1 << 11)

#define MMC_TRACKINFO_FLAGBITS \
   "\10\1COPY\2DAMAGED\3FIXEDPACKET\4INCREMENTAL\5BLANK" \
   "\6RESERVED\7NWA_VALID\10LRA_VALID\11DATA\12AUDIO" \
   "\13AUDIO_4CHAN\14PRE_EMPH"

#endif /* _CDIO_MMC_EMU_H_ */