1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * raid_class.h - a generic raid visualisation class 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Copyright (c) 2005 - James Bottomley <James.Bottomley@steeleye.com> 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun #include <linux/transport_class.h> 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun struct raid_template { 10*4882a593Smuzhiyun struct transport_container raid_attrs; 11*4882a593Smuzhiyun }; 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun struct raid_function_template { 14*4882a593Smuzhiyun void *cookie; 15*4882a593Smuzhiyun int (*is_raid)(struct device *); 16*4882a593Smuzhiyun void (*get_resync)(struct device *); 17*4882a593Smuzhiyun void (*get_state)(struct device *); 18*4882a593Smuzhiyun }; 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun enum raid_state { 21*4882a593Smuzhiyun RAID_STATE_UNKNOWN = 0, 22*4882a593Smuzhiyun RAID_STATE_ACTIVE, 23*4882a593Smuzhiyun RAID_STATE_DEGRADED, 24*4882a593Smuzhiyun RAID_STATE_RESYNCING, 25*4882a593Smuzhiyun RAID_STATE_OFFLINE, 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun enum raid_level { 29*4882a593Smuzhiyun RAID_LEVEL_UNKNOWN = 0, 30*4882a593Smuzhiyun RAID_LEVEL_LINEAR, 31*4882a593Smuzhiyun RAID_LEVEL_0, 32*4882a593Smuzhiyun RAID_LEVEL_1, 33*4882a593Smuzhiyun RAID_LEVEL_10, 34*4882a593Smuzhiyun RAID_LEVEL_1E, 35*4882a593Smuzhiyun RAID_LEVEL_3, 36*4882a593Smuzhiyun RAID_LEVEL_4, 37*4882a593Smuzhiyun RAID_LEVEL_5, 38*4882a593Smuzhiyun RAID_LEVEL_50, 39*4882a593Smuzhiyun RAID_LEVEL_6, 40*4882a593Smuzhiyun RAID_LEVEL_JBOD, 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun struct raid_data { 44*4882a593Smuzhiyun struct list_head component_list; 45*4882a593Smuzhiyun int component_count; 46*4882a593Smuzhiyun enum raid_level level; 47*4882a593Smuzhiyun enum raid_state state; 48*4882a593Smuzhiyun int resync; 49*4882a593Smuzhiyun }; 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun /* resync complete goes from 0 to this */ 52*4882a593Smuzhiyun #define RAID_MAX_RESYNC (10000) 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun #define DEFINE_RAID_ATTRIBUTE(type, attr) \ 55*4882a593Smuzhiyun static inline void \ 56*4882a593Smuzhiyun raid_set_##attr(struct raid_template *r, struct device *dev, type value) { \ 57*4882a593Smuzhiyun struct device *device = \ 58*4882a593Smuzhiyun attribute_container_find_class_device(&r->raid_attrs.ac, dev);\ 59*4882a593Smuzhiyun struct raid_data *rd; \ 60*4882a593Smuzhiyun BUG_ON(!device); \ 61*4882a593Smuzhiyun rd = dev_get_drvdata(device); \ 62*4882a593Smuzhiyun rd->attr = value; \ 63*4882a593Smuzhiyun } \ 64*4882a593Smuzhiyun static inline type \ 65*4882a593Smuzhiyun raid_get_##attr(struct raid_template *r, struct device *dev) { \ 66*4882a593Smuzhiyun struct device *device = \ 67*4882a593Smuzhiyun attribute_container_find_class_device(&r->raid_attrs.ac, dev);\ 68*4882a593Smuzhiyun struct raid_data *rd; \ 69*4882a593Smuzhiyun BUG_ON(!device); \ 70*4882a593Smuzhiyun rd = dev_get_drvdata(device); \ 71*4882a593Smuzhiyun return rd->attr; \ 72*4882a593Smuzhiyun } 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun DEFINE_RAID_ATTRIBUTE(enum raid_level, level) 75*4882a593Smuzhiyun DEFINE_RAID_ATTRIBUTE(int, resync) 76*4882a593Smuzhiyun DEFINE_RAID_ATTRIBUTE(enum raid_state, state) 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun struct raid_template *raid_class_attach(struct raid_function_template *); 79*4882a593Smuzhiyun void raid_class_release(struct raid_template *); 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun int __must_check raid_component_add(struct raid_template *, struct device *, 82*4882a593Smuzhiyun struct device *); 83*4882a593Smuzhiyun 84