Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/block/ahci/ahci.c

    r60744cb r5c55eb7  
    11/*
     2 * Copyright (c) 2025 Jiri Svoboda
    23 * Copyright (c) 2012 Petr Jerman
    34 * All rights reserved.
     
    3233
    3334#include <as.h>
     35#include <bd_srv.h>
    3436#include <errno.h>
    3537#include <stdio.h>
     
    3941#include <device/hw_res_parsed.h>
    4042#include <pci_dev_iface.h>
    41 #include <ahci_iface.h>
    4243#include "ahci.h"
    4344#include "ahci_hw.h"
     
    109110        }
    110111
    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 *);
     112static errno_t ahci_read_blocks(sata_dev_t *, uint64_t, size_t, void *);
     113static errno_t ahci_write_blocks(sata_dev_t *, uint64_t, size_t, void *);
    116114
    117115static errno_t ahci_identify_device(sata_dev_t *);
     
    131129static int sata_devices_count = 0;
    132130
    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
     131static errno_t ahci_bd_open(bd_srvs_t *, bd_srv_t *);
     132static errno_t ahci_bd_close(bd_srv_t *);
     133static errno_t ahci_bd_read_blocks(bd_srv_t *, aoff64_t, size_t, void *, size_t);
     134static errno_t ahci_bd_write_blocks(bd_srv_t *, aoff64_t, size_t, const void *, size_t);
     135static errno_t ahci_bd_get_block_size(bd_srv_t *, size_t *);
     136static errno_t ahci_bd_get_num_blocks(bd_srv_t *, aoff64_t *);
     137
     138static void ahci_bd_connection(ipc_call_t *, void *);
     139
     140static 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
    147147};
    148148
     
    156156};
    157157
    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. */
     159static 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
    214167 * @param blocknum Number of first block.
    215168 * @param count    Number of blocks to read.
    216169 * @param buf      Buffer for data.
    217170 *
    218  * @return EOK if succeed, error code otherwise
    219  *
    220  */
    221 static errno_t read_blocks(ddf_fun_t *fun, uint64_t blocknum,
     171 * @return EOK on success, error code otherwise
     172 *
     173 */
     174static errno_t ahci_read_blocks(sata_dev_t *sata, uint64_t blocknum,
    222175    size_t count, void *buf)
    223176{
    224         sata_dev_t *sata = fun_sata_dev(fun);
    225 
    226177        uintptr_t phys;
    227178        void *ibuf = AS_AREA_ANY;
     
    252203}
    253204
    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
    257208 * @param blocknum Number of first block.
    258209 * @param count    Number of blocks to write.
    259210 * @param buf      Buffer with data.
    260211 *
    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 */
     214static errno_t ahci_write_blocks(sata_dev_t *sata, uint64_t blocknum,
    265215    size_t count, void *buf)
    266216{
    267         sata_dev_t *sata = fun_sata_dev(fun);
    268 
    269217        uintptr_t phys;
    270218        void *ibuf = AS_AREA_ANY;
     
    290238
    291239        return rc;
     240}
     241
     242/** Open device. */
     243static errno_t ahci_bd_open(bd_srvs_t *bds, bd_srv_t *bd)
     244{
     245        return EOK;
     246}
     247
     248/** Close device. */
     249static errno_t ahci_bd_close(bd_srv_t *bd)
     250{
     251        return EOK;
     252}
     253
     254/** Read blocks from partition. */
     255static 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. */
     267static 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. */
     279static 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. */
     288static 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
     296static 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);
    292302}
    293303
     
    415425 * @param sata SATA device structure.
    416426 *
    417  * @return EOK if succeed, error code otherwise.
     427 * @return EOK on success, error code otherwise.
    418428 *
    419429 */
     
    596606 * @param sata SATA device structure.
    597607 *
    598  * @return EOK if succeed, error code otherwise
     608 * @return EOK on success, error code otherwise
    599609 *
    600610 */
     
    725735 * @param blocknum Block number to read.
    726736 *
    727  * @return EOK if succeed, error code otherwise
     737 * @return EOK on success, error code otherwise
    728738 *
    729739 */
     
    754764 * @param blocknum Block number to write.
    755765 *
    756  * @return EOK if succeed, error code otherwise
     766 * @return EOK on success, error code otherwise
    757767 *
    758768 */
     
    813823 * @param blocknum Block number to write.
    814824 *
    815  * @return EOK if succeed, error code otherwise
     825 * @return EOK on success, error code otherwise
    816826 *
    817827 */
     
    920930 * @param port AHCI port structure
    921931 *
    922  * @return SATA device structure if succeed, NULL otherwise.
     932 * @return SATA device structure on success, NULL otherwise.
    923933 *
    924934 */
     
    10281038 * @param port_num Number of AHCI port with existing SATA device.
    10291039 *
    1030  * @return EOK if succeed, error code otherwise.
     1040 * @return EOK on success, error code otherwise.
    10311041 *
    10321042 */
     
    10351045{
    10361046        ddf_fun_t *fun = NULL;
     1047        bool bound = false;
    10371048        errno_t rc;
    10381049
     
    10751086        }
    10761087
    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);
    10781100
    10791101        rc = ddf_fun_bind(fun);
     
    10831105        }
    10841106
     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
    10851116        return EOK;
    10861117
    10871118error:
     1119        if (bound)
     1120                ddf_fun_unbind(fun);
    10881121        sata->is_invalid_device = true;
    10891122        if (fun != NULL)
     
    11221155 * @param dev DDF device structure.
    11231156 *
    1124  * @return AHCI device structure if succeed, NULL otherwise.
     1157 * @return AHCI device structure on success, NULL otherwise.
    11251158 *
    11261159 */
     
    12461279 * @param dev DDF device structure.
    12471280 *
    1248  * @return EOK if succeed, error code otherwise.
     1281 * @return EOK on success, error code otherwise.
    12491282 *
    12501283 */
Note: See TracChangeset for help on using the changeset viewer.