Changes in uspace/drv/block/ahci/ahci.c [60744cb:5c55eb7] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/block/ahci/ahci.c
r60744cb r5c55eb7 1 1 /* 2 * Copyright (c) 2025 Jiri Svoboda 2 3 * Copyright (c) 2012 Petr Jerman 3 4 * All rights reserved. … … 32 33 33 34 #include <as.h> 35 #include <bd_srv.h> 34 36 #include <errno.h> 35 37 #include <stdio.h> … … 39 41 #include <device/hw_res_parsed.h> 40 42 #include <pci_dev_iface.h> 41 #include <ahci_iface.h>42 43 #include "ahci.h" 43 44 #include "ahci_hw.h" … … 109 110 } 110 111 111 static errno_t get_sata_device_name(ddf_fun_t *, size_t, char *); 112 static errno_t get_num_blocks(ddf_fun_t *, uint64_t *); 113 static errno_t get_block_size(ddf_fun_t *, size_t *); 114 static errno_t read_blocks(ddf_fun_t *, uint64_t, size_t, void *); 115 static errno_t write_blocks(ddf_fun_t *, uint64_t, size_t, void *); 112 static errno_t ahci_read_blocks(sata_dev_t *, uint64_t, size_t, void *); 113 static errno_t ahci_write_blocks(sata_dev_t *, uint64_t, size_t, void *); 116 114 117 115 static errno_t ahci_identify_device(sata_dev_t *); … … 131 129 static int sata_devices_count = 0; 132 130 133 /* 134 * AHCI Interface 135 */ 136 137 static ahci_iface_t ahci_interface = { 138 .get_sata_device_name = &get_sata_device_name, 139 .get_num_blocks = &get_num_blocks, 140 .get_block_size = &get_block_size, 141 .read_blocks = &read_blocks, 142 .write_blocks = &write_blocks 143 }; 144 145 static ddf_dev_ops_t ahci_ops = { 146 .interfaces[AHCI_DEV_IFACE] = &ahci_interface 131 static errno_t ahci_bd_open(bd_srvs_t *, bd_srv_t *); 132 static errno_t ahci_bd_close(bd_srv_t *); 133 static errno_t ahci_bd_read_blocks(bd_srv_t *, aoff64_t, size_t, void *, size_t); 134 static errno_t ahci_bd_write_blocks(bd_srv_t *, aoff64_t, size_t, const void *, size_t); 135 static errno_t ahci_bd_get_block_size(bd_srv_t *, size_t *); 136 static errno_t ahci_bd_get_num_blocks(bd_srv_t *, aoff64_t *); 137 138 static void ahci_bd_connection(ipc_call_t *, void *); 139 140 static bd_ops_t ahci_bd_ops = { 141 .open = ahci_bd_open, 142 .close = ahci_bd_close, 143 .read_blocks = ahci_bd_read_blocks, 144 .write_blocks = ahci_bd_write_blocks, 145 .get_block_size = ahci_bd_get_block_size, 146 .get_num_blocks = ahci_bd_get_num_blocks 147 147 }; 148 148 … … 156 156 }; 157 157 158 /** Get SATA structure from DDF function. */ 159 static sata_dev_t *fun_sata_dev(ddf_fun_t *fun) 160 { 161 return ddf_fun_data_get(fun); 162 } 163 164 /** Get SATA device name. 165 * 166 * @param fun Device function handling the call. 167 * @param sata_dev_name_length Length of the sata_dev_name buffer. 168 * @param sata_dev_name Buffer for SATA device name. 169 * 170 * @return EOK. 171 * 172 */ 173 static errno_t get_sata_device_name(ddf_fun_t *fun, 174 size_t sata_dev_name_length, char *sata_dev_name) 175 { 176 sata_dev_t *sata = fun_sata_dev(fun); 177 str_cpy(sata_dev_name, sata_dev_name_length, sata->model); 178 return EOK; 179 } 180 181 /** Get Number of blocks in SATA device. 182 * 183 * @param fun Device function handling the call. 184 * @param blocks Return number of blocks in SATA device. 185 * 186 * @return EOK. 187 * 188 */ 189 static errno_t get_num_blocks(ddf_fun_t *fun, uint64_t *num_blocks) 190 { 191 sata_dev_t *sata = fun_sata_dev(fun); 192 *num_blocks = sata->blocks; 193 return EOK; 194 } 195 196 /** Get SATA device block size. 197 * 198 * @param fun Device function handling the call. 199 * @param block_size Return block size. 200 * 201 * @return EOK. 202 * 203 */ 204 static errno_t get_block_size(ddf_fun_t *fun, size_t *block_size) 205 { 206 sata_dev_t *sata = fun_sata_dev(fun); 207 *block_size = sata->block_size; 208 return EOK; 209 } 210 211 /** Read data blocks into SATA device. 212 * 213 * @param fun Device function handling the call. 158 /** Get SATA structure from block device service structure. */ 159 static sata_dev_t *bd_srv_sata(bd_srv_t *bd) 160 { 161 return (sata_dev_t *) bd->srvs->sarg; 162 } 163 164 /** Read data blocks from SATA device. 165 * 166 * @param sata SATA device 214 167 * @param blocknum Number of first block. 215 168 * @param count Number of blocks to read. 216 169 * @param buf Buffer for data. 217 170 * 218 * @return EOK if succeed, error code otherwise219 * 220 */ 221 static errno_t read_blocks(ddf_fun_t *fun, uint64_t blocknum,171 * @return EOK on success, error code otherwise 172 * 173 */ 174 static errno_t ahci_read_blocks(sata_dev_t *sata, uint64_t blocknum, 222 175 size_t count, void *buf) 223 176 { 224 sata_dev_t *sata = fun_sata_dev(fun);225 226 177 uintptr_t phys; 227 178 void *ibuf = AS_AREA_ANY; … … 252 203 } 253 204 254 /** Write data blocks into SATA device.255 * 256 * @param fun Device function handling the call.205 /** Write data blocks to SATA device. 206 * 207 * @param sata SATA device 257 208 * @param blocknum Number of first block. 258 209 * @param count Number of blocks to write. 259 210 * @param buf Buffer with data. 260 211 * 261 * @return EOK if succeed, error code otherwise 262 * 263 */ 264 static errno_t write_blocks(ddf_fun_t *fun, uint64_t blocknum, 212 * @return EOK on success, error code otherwise 213 */ 214 static errno_t ahci_write_blocks(sata_dev_t *sata, uint64_t blocknum, 265 215 size_t count, void *buf) 266 216 { 267 sata_dev_t *sata = fun_sata_dev(fun);268 269 217 uintptr_t phys; 270 218 void *ibuf = AS_AREA_ANY; … … 290 238 291 239 return rc; 240 } 241 242 /** Open device. */ 243 static errno_t ahci_bd_open(bd_srvs_t *bds, bd_srv_t *bd) 244 { 245 return EOK; 246 } 247 248 /** Close device. */ 249 static errno_t ahci_bd_close(bd_srv_t *bd) 250 { 251 return EOK; 252 } 253 254 /** Read blocks from partition. */ 255 static errno_t ahci_bd_read_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt, 256 void *buf, size_t size) 257 { 258 sata_dev_t *sata = bd_srv_sata(bd); 259 260 if (size < cnt * sata->block_size) 261 return EINVAL; 262 263 return ahci_read_blocks(sata, ba, cnt, buf); 264 } 265 266 /** Write blocks to partition. */ 267 static errno_t ahci_bd_write_blocks(bd_srv_t *bd, aoff64_t ba, size_t cnt, 268 const void *buf, size_t size) 269 { 270 sata_dev_t *sata = bd_srv_sata(bd); 271 272 if (size < cnt * sata->block_size) 273 return EINVAL; 274 275 return ahci_write_blocks(sata, ba, cnt, (void *)buf); 276 } 277 278 /** Get device block size. */ 279 static errno_t ahci_bd_get_block_size(bd_srv_t *bd, size_t *rsize) 280 { 281 sata_dev_t *sata = bd_srv_sata(bd); 282 283 *rsize = sata->block_size; 284 return EOK; 285 } 286 287 /** Get number of blocks on device. */ 288 static errno_t ahci_bd_get_num_blocks(bd_srv_t *bd, aoff64_t *rnb) 289 { 290 sata_dev_t *sata = bd_srv_sata(bd); 291 292 *rnb = sata->blocks; 293 return EOK; 294 } 295 296 static void ahci_bd_connection(ipc_call_t *icall, void *arg) 297 { 298 sata_dev_t *sata; 299 300 sata = (sata_dev_t *) ddf_fun_data_get((ddf_fun_t *)arg); 301 bd_conn(icall, &sata->bds); 292 302 } 293 303 … … 415 425 * @param sata SATA device structure. 416 426 * 417 * @return EOK if succeed, error code otherwise.427 * @return EOK on success, error code otherwise. 418 428 * 419 429 */ … … 596 606 * @param sata SATA device structure. 597 607 * 598 * @return EOK if succeed, error code otherwise608 * @return EOK on success, error code otherwise 599 609 * 600 610 */ … … 725 735 * @param blocknum Block number to read. 726 736 * 727 * @return EOK if succeed, error code otherwise737 * @return EOK on success, error code otherwise 728 738 * 729 739 */ … … 754 764 * @param blocknum Block number to write. 755 765 * 756 * @return EOK if succeed, error code otherwise766 * @return EOK on success, error code otherwise 757 767 * 758 768 */ … … 813 823 * @param blocknum Block number to write. 814 824 * 815 * @return EOK if succeed, error code otherwise825 * @return EOK on success, error code otherwise 816 826 * 817 827 */ … … 920 930 * @param port AHCI port structure 921 931 * 922 * @return SATA device structure if succeed, NULL otherwise.932 * @return SATA device structure on success, NULL otherwise. 923 933 * 924 934 */ … … 1028 1038 * @param port_num Number of AHCI port with existing SATA device. 1029 1039 * 1030 * @return EOK if succeed, error code otherwise.1040 * @return EOK on success, error code otherwise. 1031 1041 * 1032 1042 */ … … 1035 1045 { 1036 1046 ddf_fun_t *fun = NULL; 1047 bool bound = false; 1037 1048 errno_t rc; 1038 1049 … … 1075 1086 } 1076 1087 1077 ddf_fun_set_ops(fun, &ahci_ops); 1088 fun = sata->fun; 1089 1090 bd_srvs_init(&sata->bds); 1091 sata->bds.ops = &ahci_bd_ops; 1092 sata->bds.sarg = (void *)sata; 1093 1094 /* Set up a connection handler. */ 1095 ddf_fun_set_conn_handler(fun, ahci_bd_connection); 1096 1097 ddf_msg(LVL_NOTE, "Device %s - %s, blocks: %" PRIu64 1098 " block_size: %zu\n", sata_dev_name, sata->model, sata->blocks, 1099 sata->block_size); 1078 1100 1079 1101 rc = ddf_fun_bind(fun); … … 1083 1105 } 1084 1106 1107 bound = true; 1108 1109 rc = ddf_fun_add_to_category(fun, "disk"); 1110 if (rc != EOK) { 1111 ddf_msg(LVL_ERROR, "Failed adding function %s to category " 1112 "'disk'.", sata_dev_name); 1113 goto error; 1114 } 1115 1085 1116 return EOK; 1086 1117 1087 1118 error: 1119 if (bound) 1120 ddf_fun_unbind(fun); 1088 1121 sata->is_invalid_device = true; 1089 1122 if (fun != NULL) … … 1122 1155 * @param dev DDF device structure. 1123 1156 * 1124 * @return AHCI device structure if succeed, NULL otherwise.1157 * @return AHCI device structure on success, NULL otherwise. 1125 1158 * 1126 1159 */ … … 1246 1279 * @param dev DDF device structure. 1247 1280 * 1248 * @return EOK if succeed, error code otherwise.1281 * @return EOK on success, error code otherwise. 1249 1282 * 1250 1283 */
Note:
See TracChangeset
for help on using the changeset viewer.