xref: /freebsd/usr.bin/sdiotool/cam_sdio.h (revision 1d386b48)
1029c02a3SIlya Bakulin /*-
24d846d26SWarner Losh  * SPDX-License-Identifier: BSD-2-Clause
36e778a7eSPedro F. Giffuni  *
4029c02a3SIlya Bakulin  * Copyright (c) 2017 Ilya Bakulin
5029c02a3SIlya Bakulin  * All rights reserved.
6029c02a3SIlya Bakulin  *
7029c02a3SIlya Bakulin  * Redistribution and use in source and binary forms, with or without
8029c02a3SIlya Bakulin  * modification, are permitted provided that the following conditions
9029c02a3SIlya Bakulin  * are met:
10029c02a3SIlya Bakulin  * 1. Redistributions of source code must retain the above copyright
11029c02a3SIlya Bakulin  *    notice, this list of conditions and the following disclaimer.
12029c02a3SIlya Bakulin  * 2. Redistributions in binary form must reproduce the above copyright
13029c02a3SIlya Bakulin  *    notice, this list of conditions and the following disclaimer in the
14029c02a3SIlya Bakulin  *    documentation and/or other materials provided with the distribution.
15029c02a3SIlya Bakulin  *
16029c02a3SIlya Bakulin  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17029c02a3SIlya Bakulin  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18029c02a3SIlya Bakulin  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19029c02a3SIlya Bakulin  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20029c02a3SIlya Bakulin  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21029c02a3SIlya Bakulin  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22029c02a3SIlya Bakulin  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23029c02a3SIlya Bakulin  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24029c02a3SIlya Bakulin  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25029c02a3SIlya Bakulin  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26029c02a3SIlya Bakulin  * SUCH DAMAGE.
27029c02a3SIlya Bakulin  */
28029c02a3SIlya Bakulin 
29029c02a3SIlya Bakulin #include <sys/cdefs.h>
30029c02a3SIlya Bakulin #include <sys/ioctl.h>
31029c02a3SIlya Bakulin #include <sys/stdint.h>
32029c02a3SIlya Bakulin #include <sys/types.h>
33029c02a3SIlya Bakulin #include <sys/stat.h>
34029c02a3SIlya Bakulin #include <sys/endian.h>
35029c02a3SIlya Bakulin #include <sys/sbuf.h>
36029c02a3SIlya Bakulin #include <sys/mman.h>
37029c02a3SIlya Bakulin 
38029c02a3SIlya Bakulin #include <stdio.h>
39029c02a3SIlya Bakulin #include <stdlib.h>
40029c02a3SIlya Bakulin #include <string.h>
41029c02a3SIlya Bakulin #include <unistd.h>
42029c02a3SIlya Bakulin #include <inttypes.h>
43029c02a3SIlya Bakulin #include <limits.h>
44029c02a3SIlya Bakulin #include <fcntl.h>
45029c02a3SIlya Bakulin #include <ctype.h>
46029c02a3SIlya Bakulin #include <err.h>
47029c02a3SIlya Bakulin #include <libutil.h>
48029c02a3SIlya Bakulin #include <unistd.h>
49029c02a3SIlya Bakulin 
50029c02a3SIlya Bakulin #include <cam/cam.h>
51029c02a3SIlya Bakulin #include <cam/cam_debug.h>
52029c02a3SIlya Bakulin #include <cam/cam_ccb.h>
53029c02a3SIlya Bakulin #include <cam/mmc/mmc_all.h>
54029c02a3SIlya Bakulin #include <camlib.h>
55029c02a3SIlya Bakulin 
56029c02a3SIlya Bakulin struct cis_info {
57029c02a3SIlya Bakulin 	uint16_t man_id;
58029c02a3SIlya Bakulin 	uint16_t prod_id;
59029c02a3SIlya Bakulin 	uint16_t max_block_size;
60029c02a3SIlya Bakulin };
61029c02a3SIlya Bakulin 
62029c02a3SIlya Bakulin int sdio_rw_direct(struct cam_device *dev,
63029c02a3SIlya Bakulin 			  uint8_t func_number,
64029c02a3SIlya Bakulin 			  uint32_t addr,
65029c02a3SIlya Bakulin 			  uint8_t is_write,
66029c02a3SIlya Bakulin 			  uint8_t *data,
67029c02a3SIlya Bakulin 			  uint8_t *resp);
68029c02a3SIlya Bakulin int
69029c02a3SIlya Bakulin sdio_rw_extended(struct cam_device *dev,
70029c02a3SIlya Bakulin 		 uint8_t func_number,
71029c02a3SIlya Bakulin 		 uint32_t addr,
72029c02a3SIlya Bakulin 		 uint8_t is_write,
73029c02a3SIlya Bakulin 		 caddr_t data, size_t datalen,
74029c02a3SIlya Bakulin 		 uint8_t is_increment,
75029c02a3SIlya Bakulin 		 uint16_t blk_count);
76029c02a3SIlya Bakulin uint8_t sdio_read_1(struct cam_device *dev, uint8_t func_number, uint32_t addr, int *ret);
77029c02a3SIlya Bakulin int sdio_write_1(struct cam_device *dev, uint8_t func_number, uint32_t addr, uint8_t val);
78029c02a3SIlya Bakulin uint16_t sdio_read_2(struct cam_device *dev, uint8_t func_number, uint32_t addr, int *ret);
79029c02a3SIlya Bakulin int sdio_write_2(struct cam_device *dev, uint8_t func_number, uint32_t addr, uint16_t val);
80029c02a3SIlya Bakulin uint32_t sdio_read_4(struct cam_device *dev, uint8_t func_number, uint32_t addr, int *ret);
81029c02a3SIlya Bakulin int sdio_write_4(struct cam_device *dev, uint8_t func_number, uint32_t addr, uint32_t val);
82029c02a3SIlya Bakulin int sdio_read_bool_for_func(struct cam_device *dev, uint32_t addr, uint8_t func_number, uint8_t *is_enab);
83029c02a3SIlya Bakulin int sdio_set_bool_for_func(struct cam_device *dev, uint32_t addr, uint8_t func_number, int enable);
84029c02a3SIlya Bakulin int sdio_is_func_ready(struct cam_device *dev, uint8_t func_number, uint8_t *is_enab);
85029c02a3SIlya Bakulin int sdio_is_func_enabled(struct cam_device *dev, uint8_t func_number, uint8_t *is_enab);
86029c02a3SIlya Bakulin int sdio_func_enable(struct cam_device *dev, uint8_t func_number, int enable);
87029c02a3SIlya Bakulin int sdio_is_func_intr_enabled(struct cam_device *dev, uint8_t func_number, uint8_t *is_enab);
88029c02a3SIlya Bakulin int sdio_func_intr_enable(struct cam_device *dev, uint8_t func_number, int enable);
89029c02a3SIlya Bakulin void sdio_card_reset(struct cam_device *dev);
90029c02a3SIlya Bakulin uint32_t sdio_get_common_cis_addr(struct cam_device *dev);
91029c02a3SIlya Bakulin int sdio_func_read_cis(struct cam_device *dev, uint8_t func_number,
92029c02a3SIlya Bakulin 		       uint32_t cis_addr, struct cis_info *info);
93029c02a3SIlya Bakulin int sdio_card_set_bus_width(struct cam_device *dev, enum mmc_bus_width bw);
94