linux-headers (unknown)

(root)/
include/
linux/
blkzoned.h
       1  /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
       2  /*
       3   * Zoned block devices handling.
       4   *
       5   * Copyright (C) 2015 Seagate Technology PLC
       6   *
       7   * Written by: Shaun Tancheff <shaun.tancheff@seagate.com>
       8   *
       9   * Modified by: Damien Le Moal <damien.lemoal@hgst.com>
      10   * Copyright (C) 2016 Western Digital
      11   *
      12   * This file is licensed under  the terms of the GNU General Public
      13   * License version 2. This program is licensed "as is" without any
      14   * warranty of any kind, whether express or implied.
      15   */
      16  #ifndef _BLKZONED_H
      17  #define _BLKZONED_H
      18  
      19  #include <linux/types.h>
      20  #include <linux/ioctl.h>
      21  
      22  /**
      23   * enum blk_zone_type - Types of zones allowed in a zoned device.
      24   *
      25   * @BLK_ZONE_TYPE_CONVENTIONAL: The zone has no write pointer and can be writen
      26   *                              randomly. Zone reset has no effect on the zone.
      27   * @BLK_ZONE_TYPE_SEQWRITE_REQ: The zone must be written sequentially
      28   * @BLK_ZONE_TYPE_SEQWRITE_PREF: The zone can be written non-sequentially
      29   *
      30   * Any other value not defined is reserved and must be considered as invalid.
      31   */
      32  enum blk_zone_type {
      33  	BLK_ZONE_TYPE_CONVENTIONAL	= 0x1,
      34  	BLK_ZONE_TYPE_SEQWRITE_REQ	= 0x2,
      35  	BLK_ZONE_TYPE_SEQWRITE_PREF	= 0x3,
      36  };
      37  
      38  /**
      39   * enum blk_zone_cond - Condition [state] of a zone in a zoned device.
      40   *
      41   * @BLK_ZONE_COND_NOT_WP: The zone has no write pointer, it is conventional.
      42   * @BLK_ZONE_COND_EMPTY: The zone is empty.
      43   * @BLK_ZONE_COND_IMP_OPEN: The zone is open, but not explicitly opened.
      44   * @BLK_ZONE_COND_EXP_OPEN: The zones was explicitly opened by an
      45   *                          OPEN ZONE command.
      46   * @BLK_ZONE_COND_CLOSED: The zone was [explicitly] closed after writing.
      47   * @BLK_ZONE_COND_FULL: The zone is marked as full, possibly by a zone
      48   *                      FINISH ZONE command.
      49   * @BLK_ZONE_COND_READONLY: The zone is read-only.
      50   * @BLK_ZONE_COND_OFFLINE: The zone is offline (sectors cannot be read/written).
      51   *
      52   * The Zone Condition state machine in the ZBC/ZAC standards maps the above
      53   * deinitions as:
      54   *   - ZC1: Empty         | BLK_ZONE_EMPTY
      55   *   - ZC2: Implicit Open | BLK_ZONE_COND_IMP_OPEN
      56   *   - ZC3: Explicit Open | BLK_ZONE_COND_EXP_OPEN
      57   *   - ZC4: Closed        | BLK_ZONE_CLOSED
      58   *   - ZC5: Full          | BLK_ZONE_FULL
      59   *   - ZC6: Read Only     | BLK_ZONE_READONLY
      60   *   - ZC7: Offline       | BLK_ZONE_OFFLINE
      61   *
      62   * Conditions 0x5 to 0xC are reserved by the current ZBC/ZAC spec and should
      63   * be considered invalid.
      64   */
      65  enum blk_zone_cond {
      66  	BLK_ZONE_COND_NOT_WP	= 0x0,
      67  	BLK_ZONE_COND_EMPTY	= 0x1,
      68  	BLK_ZONE_COND_IMP_OPEN	= 0x2,
      69  	BLK_ZONE_COND_EXP_OPEN	= 0x3,
      70  	BLK_ZONE_COND_CLOSED	= 0x4,
      71  	BLK_ZONE_COND_READONLY	= 0xD,
      72  	BLK_ZONE_COND_FULL	= 0xE,
      73  	BLK_ZONE_COND_OFFLINE	= 0xF,
      74  };
      75  
      76  /**
      77   * enum blk_zone_report_flags - Feature flags of reported zone descriptors.
      78   *
      79   * @BLK_ZONE_REP_CAPACITY: Zone descriptor has capacity field.
      80   */
      81  enum blk_zone_report_flags {
      82  	BLK_ZONE_REP_CAPACITY	= (1 << 0),
      83  };
      84  
      85  /**
      86   * struct blk_zone - Zone descriptor for BLKREPORTZONE ioctl.
      87   *
      88   * @start: Zone start in 512 B sector units
      89   * @len: Zone length in 512 B sector units
      90   * @wp: Zone write pointer location in 512 B sector units
      91   * @type: see enum blk_zone_type for possible values
      92   * @cond: see enum blk_zone_cond for possible values
      93   * @non_seq: Flag indicating that the zone is using non-sequential resources
      94   *           (for host-aware zoned block devices only).
      95   * @reset: Flag indicating that a zone reset is recommended.
      96   * @resv: Padding for 8B alignment.
      97   * @capacity: Zone usable capacity in 512 B sector units
      98   * @reserved: Padding to 64 B to match the ZBC, ZAC and ZNS defined zone
      99   *            descriptor size.
     100   *
     101   * start, len, capacity and wp use the regular 512 B sector unit, regardless
     102   * of the device logical block size. The overall structure size is 64 B to
     103   * match the ZBC, ZAC and ZNS defined zone descriptor and allow support for
     104   * future additional zone information.
     105   */
     106  struct blk_zone {
     107  	__u64	start;		/* Zone start sector */
     108  	__u64	len;		/* Zone length in number of sectors */
     109  	__u64	wp;		/* Zone write pointer position */
     110  	__u8	type;		/* Zone type */
     111  	__u8	cond;		/* Zone condition */
     112  	__u8	non_seq;	/* Non-sequential write resources active */
     113  	__u8	reset;		/* Reset write pointer recommended */
     114  	__u8	resv[4];
     115  	__u64	capacity;	/* Zone capacity in number of sectors */
     116  	__u8	reserved[24];
     117  };
     118  
     119  /**
     120   * struct blk_zone_report - BLKREPORTZONE ioctl request/reply
     121   *
     122   * @sector: starting sector of report
     123   * @nr_zones: IN maximum / OUT actual
     124   * @flags: one or more flags as defined by enum blk_zone_report_flags.
     125   * @zones: Space to hold @nr_zones @zones entries on reply.
     126   *
     127   * The array of at most @nr_zones must follow this structure in memory.
     128   */
     129  struct blk_zone_report {
     130  	__u64		sector;
     131  	__u32		nr_zones;
     132  	__u32		flags;
     133  	struct blk_zone zones[];
     134  };
     135  
     136  /**
     137   * struct blk_zone_range - BLKRESETZONE/BLKOPENZONE/
     138   *                         BLKCLOSEZONE/BLKFINISHZONE ioctl
     139   *                         requests
     140   * @sector: Starting sector of the first zone to operate on.
     141   * @nr_sectors: Total number of sectors of all zones to operate on.
     142   */
     143  struct blk_zone_range {
     144  	__u64		sector;
     145  	__u64		nr_sectors;
     146  };
     147  
     148  /**
     149   * Zoned block device ioctl's:
     150   *
     151   * @BLKREPORTZONE: Get zone information. Takes a zone report as argument.
     152   *                 The zone report will start from the zone containing the
     153   *                 sector specified in the report request structure.
     154   * @BLKRESETZONE: Reset the write pointer of the zones in the specified
     155   *                sector range. The sector range must be zone aligned.
     156   * @BLKGETZONESZ: Get the device zone size in number of 512 B sectors.
     157   * @BLKGETNRZONES: Get the total number of zones of the device.
     158   * @BLKOPENZONE: Open the zones in the specified sector range.
     159   *               The 512 B sector range must be zone aligned.
     160   * @BLKCLOSEZONE: Close the zones in the specified sector range.
     161   *                The 512 B sector range must be zone aligned.
     162   * @BLKFINISHZONE: Mark the zones as full in the specified sector range.
     163   *                 The 512 B sector range must be zone aligned.
     164   */
     165  #define BLKREPORTZONE	_IOWR(0x12, 130, struct blk_zone_report)
     166  #define BLKRESETZONE	_IOW(0x12, 131, struct blk_zone_range)
     167  #define BLKGETZONESZ	_IOR(0x12, 132, __u32)
     168  #define BLKGETNRZONES	_IOR(0x12, 133, __u32)
     169  #define BLKOPENZONE	_IOW(0x12, 134, struct blk_zone_range)
     170  #define BLKCLOSEZONE	_IOW(0x12, 135, struct blk_zone_range)
     171  #define BLKFINISHZONE	_IOW(0x12, 136, struct blk_zone_range)
     172  
     173  #endif /* _BLKZONED_H */