1@startuml
2
3package arm_io_storage {
4
5	class plat_io_policy {
6		dev_handle : uintptr_t*
7		image_spec : uintptr_t
8		{abstract} check() : fctptr
9	}
10
11	class FIP_IMAGE_ID {
12		memmap_dev_handle
13		fip_block_spec
14		open_memmap()
15	}
16
17	class BL2_IMAGE_ID{
18		fip_dev_handle
19		bl2_uuid_spec
20		open_fip()
21	}
22
23	class xxx_IMAGE_ID{
24		fip_dev_handle
25		xxx_uuid_spec
26		open_fip()
27	}
28
29	class arm_io_storage {
30		fip_dev_con : io_dev_connector_t*
31		fip_dev_handle : uintptr_t
32		memmap_dev_con : io_dev_connector_t*
33		memmap_dev_handle : uintptr_t
34
35		fip_block_spec : io_block_spec_t
36
37		policies : plat_io_policy[1..*]
38
39		-open_fip()
40		-open_memmap()
41
42		+arm_io_setup()
43		+plat_get_image_source()
44	}
45
46	FIP_IMAGE_ID -up-|> plat_io_policy
47	BL2_IMAGE_ID -up-|> plat_io_policy
48	xxx_IMAGE_ID -up-|> plat_io_policy
49
50	arm_io_storage *-"1..*" plat_io_policy
51}
52
53package IO {
54	class  io_storage {
55		io_dev_open()
56		io_dev_init()
57		io_dev_close()
58
59		.. synchronous operations ..
60		io_open()
61		io_seek()
62		io_size()
63		io_read()
64		io_write()
65		io_close()
66
67		io_register_device()
68	}
69
70	class io_fip {
71		register_io_dev_fip()
72		.. io_dev_funcs_t interface ..
73		fip_dev_funcs : io_dev_funcs_t
74	}
75
76	class io_memmap {
77		register_io_dev_memmap()
78		.. io_dev_funcs_t interface ..
79		memmap_dev_funcs : io_dev_funcs_t
80	}
81
82	interface io_driver {
83		io_entity_t
84		io_dev_info_t
85
86		.. io_dev_connector_t interface ..
87		dev_open()
88
89		.. io_dev_funcs_t interface ..
90			type()
91			open()
92			seek()
93			size()
94			read()
95			write()
96			close()
97			dev_init()
98			dev_close()
99
100		io_register_device()
101	}
102}
103arm_io_storage .. io_driver
104arm_io_storage .. io_fip
105arm_io_storage .. io_memmap
106arm_io_storage .. io_storage
107
108
109@enduml
110