at for-next 3.2 kB view raw
1/* SPDX-License-Identifier: GPL-2.0 */ 2/* 3 * Copyright (C) 2015-2019 Intel Corp. All rights reserved 4 * Copyright (C) 2021-2022 Linaro Ltd 5 */ 6#ifndef __RPMB_H__ 7#define __RPMB_H__ 8 9#include <linux/device.h> 10#include <linux/types.h> 11 12/** 13 * enum rpmb_type - type of underlying storage technology 14 * 15 * @RPMB_TYPE_EMMC : emmc (JESD84-B50.1) 16 * @RPMB_TYPE_UFS : UFS (JESD220) 17 * @RPMB_TYPE_NVME : NVM Express 18 */ 19enum rpmb_type { 20 RPMB_TYPE_EMMC, 21 RPMB_TYPE_UFS, 22 RPMB_TYPE_NVME, 23}; 24 25/** 26 * struct rpmb_descr - RPMB description provided by the underlying block device 27 * 28 * @type : block device type 29 * @route_frames : routes frames to and from the RPMB device 30 * @dev_id : unique device identifier read from the hardware 31 * @dev_id_len : length of unique device identifier 32 * @reliable_wr_count: number of sectors that can be written in one access 33 * @capacity : capacity of the device in units of 128K 34 * 35 * @dev_id is intended to be used as input when deriving the authenticaion key. 36 */ 37struct rpmb_descr { 38 enum rpmb_type type; 39 int (*route_frames)(struct device *dev, u8 *req, unsigned int req_len, 40 u8 *resp, unsigned int resp_len); 41 u8 *dev_id; 42 size_t dev_id_len; 43 u16 reliable_wr_count; 44 u16 capacity; 45}; 46 47/** 48 * struct rpmb_dev - device which can support RPMB partition 49 * 50 * @dev : device 51 * @id : device_id 52 * @list_node : linked list node 53 * @descr : RPMB description 54 */ 55struct rpmb_dev { 56 struct device dev; 57 int id; 58 struct list_head list_node; 59 struct rpmb_descr descr; 60}; 61 62#define to_rpmb_dev(x) container_of((x), struct rpmb_dev, dev) 63 64#if IS_ENABLED(CONFIG_RPMB) 65struct rpmb_dev *rpmb_dev_get(struct rpmb_dev *rdev); 66void rpmb_dev_put(struct rpmb_dev *rdev); 67struct rpmb_dev *rpmb_dev_find_device(const void *data, 68 const struct rpmb_dev *start, 69 int (*match)(struct device *dev, 70 const void *data)); 71int rpmb_interface_register(struct class_interface *intf); 72void rpmb_interface_unregister(struct class_interface *intf); 73struct rpmb_dev *rpmb_dev_register(struct device *dev, 74 struct rpmb_descr *descr); 75int rpmb_dev_unregister(struct rpmb_dev *rdev); 76 77int rpmb_route_frames(struct rpmb_dev *rdev, u8 *req, 78 unsigned int req_len, u8 *resp, unsigned int resp_len); 79 80#else 81static inline struct rpmb_dev *rpmb_dev_get(struct rpmb_dev *rdev) 82{ 83 return NULL; 84} 85 86static inline void rpmb_dev_put(struct rpmb_dev *rdev) { } 87 88static inline struct rpmb_dev * 89rpmb_dev_find_device(const void *data, const struct rpmb_dev *start, 90 int (*match)(struct device *dev, const void *data)) 91{ 92 return NULL; 93} 94 95static inline int rpmb_interface_register(struct class_interface *intf) 96{ 97 return -EOPNOTSUPP; 98} 99 100static inline void rpmb_interface_unregister(struct class_interface *intf) 101{ 102} 103 104static inline struct rpmb_dev * 105rpmb_dev_register(struct device *dev, struct rpmb_descr *descr) 106{ 107 return NULL; 108} 109 110static inline int rpmb_dev_unregister(struct rpmb_dev *dev) 111{ 112 return 0; 113} 114 115static inline int rpmb_route_frames(struct rpmb_dev *rdev, u8 *req, 116 unsigned int req_len, u8 *resp, 117 unsigned int resp_len) 118{ 119 return -EOPNOTSUPP; 120} 121#endif /* CONFIG_RPMB */ 122 123#endif /* __RPMB_H__ */