xref: /rk3399_rockchip-uboot/drivers/ata/sata.c (revision f2105c61821b67bc1d572304d901518e88ee007b)
1*f2105c61SSimon Glass /*
2*f2105c61SSimon Glass  * Copyright (C) 2000-2005, DENX Software Engineering
3*f2105c61SSimon Glass  *		Wolfgang Denk <wd@denx.de>
4*f2105c61SSimon Glass  * Copyright (C) Procsys. All rights reserved.
5*f2105c61SSimon Glass  *		Mushtaq Khan <mushtaq_k@procsys.com>
6*f2105c61SSimon Glass  *			<mushtaqk_921@yahoo.co.in>
7*f2105c61SSimon Glass  * Copyright (C) 2008 Freescale Semiconductor, Inc.
8*f2105c61SSimon Glass  *		Dave Liu <daveliu@freescale.com>
9*f2105c61SSimon Glass  *
10*f2105c61SSimon Glass  * SPDX-License-Identifier:	GPL-2.0+
11*f2105c61SSimon Glass  */
12*f2105c61SSimon Glass 
13*f2105c61SSimon Glass #include <common.h>
14*f2105c61SSimon Glass #include <dm.h>
15*f2105c61SSimon Glass #include <sata.h>
16*f2105c61SSimon Glass 
17*f2105c61SSimon Glass struct blk_desc sata_dev_desc[CONFIG_SYS_SATA_MAX_DEVICE];
18*f2105c61SSimon Glass 
19*f2105c61SSimon Glass #ifdef CONFIG_PARTITIONS
20*f2105c61SSimon Glass struct blk_desc *sata_get_dev(int dev)
21*f2105c61SSimon Glass {
22*f2105c61SSimon Glass 	return (dev < CONFIG_SYS_SATA_MAX_DEVICE) ? &sata_dev_desc[dev] : NULL;
23*f2105c61SSimon Glass }
24*f2105c61SSimon Glass #endif
25*f2105c61SSimon Glass 
26*f2105c61SSimon Glass #ifdef CONFIG_BLK
27*f2105c61SSimon Glass static unsigned long sata_bread(struct udevice *dev, lbaint_t start,
28*f2105c61SSimon Glass 				lbaint_t blkcnt, void *dst)
29*f2105c61SSimon Glass {
30*f2105c61SSimon Glass 	return -ENOSYS;
31*f2105c61SSimon Glass }
32*f2105c61SSimon Glass 
33*f2105c61SSimon Glass static unsigned long sata_bwrite(struct udevice *dev, lbaint_t start,
34*f2105c61SSimon Glass 				 lbaint_t blkcnt, const void *buffer)
35*f2105c61SSimon Glass {
36*f2105c61SSimon Glass 	return -ENOSYS;
37*f2105c61SSimon Glass }
38*f2105c61SSimon Glass #else
39*f2105c61SSimon Glass static unsigned long sata_bread(struct blk_desc *block_dev, lbaint_t start,
40*f2105c61SSimon Glass 				lbaint_t blkcnt, void *dst)
41*f2105c61SSimon Glass {
42*f2105c61SSimon Glass 	return sata_read(block_dev->devnum, start, blkcnt, dst);
43*f2105c61SSimon Glass }
44*f2105c61SSimon Glass 
45*f2105c61SSimon Glass static unsigned long sata_bwrite(struct blk_desc *block_dev, lbaint_t start,
46*f2105c61SSimon Glass 				 lbaint_t blkcnt, const void *buffer)
47*f2105c61SSimon Glass {
48*f2105c61SSimon Glass 	return sata_write(block_dev->devnum, start, blkcnt, buffer);
49*f2105c61SSimon Glass }
50*f2105c61SSimon Glass #endif
51*f2105c61SSimon Glass 
52*f2105c61SSimon Glass int __sata_initialize(void)
53*f2105c61SSimon Glass {
54*f2105c61SSimon Glass 	int rc, ret = -1;
55*f2105c61SSimon Glass 	int i;
56*f2105c61SSimon Glass 
57*f2105c61SSimon Glass 	for (i = 0; i < CONFIG_SYS_SATA_MAX_DEVICE; i++) {
58*f2105c61SSimon Glass 		memset(&sata_dev_desc[i], 0, sizeof(struct blk_desc));
59*f2105c61SSimon Glass 		sata_dev_desc[i].if_type = IF_TYPE_SATA;
60*f2105c61SSimon Glass 		sata_dev_desc[i].devnum = i;
61*f2105c61SSimon Glass 		sata_dev_desc[i].part_type = PART_TYPE_UNKNOWN;
62*f2105c61SSimon Glass 		sata_dev_desc[i].type = DEV_TYPE_HARDDISK;
63*f2105c61SSimon Glass 		sata_dev_desc[i].lba = 0;
64*f2105c61SSimon Glass 		sata_dev_desc[i].blksz = 512;
65*f2105c61SSimon Glass 		sata_dev_desc[i].log2blksz = LOG2(sata_dev_desc[i].blksz);
66*f2105c61SSimon Glass #ifndef CONFIG_BLK
67*f2105c61SSimon Glass 		sata_dev_desc[i].block_read = sata_bread;
68*f2105c61SSimon Glass 		sata_dev_desc[i].block_write = sata_bwrite;
69*f2105c61SSimon Glass #endif
70*f2105c61SSimon Glass 		rc = init_sata(i);
71*f2105c61SSimon Glass 		if (!rc) {
72*f2105c61SSimon Glass 			rc = scan_sata(i);
73*f2105c61SSimon Glass 			if (!rc && sata_dev_desc[i].lba > 0 &&
74*f2105c61SSimon Glass 			    sata_dev_desc[i].blksz > 0) {
75*f2105c61SSimon Glass 				part_init(&sata_dev_desc[i]);
76*f2105c61SSimon Glass 				ret = i;
77*f2105c61SSimon Glass 			}
78*f2105c61SSimon Glass 		}
79*f2105c61SSimon Glass 	}
80*f2105c61SSimon Glass 
81*f2105c61SSimon Glass 	return ret;
82*f2105c61SSimon Glass }
83*f2105c61SSimon Glass int sata_initialize(void) __attribute__((weak, alias("__sata_initialize")));
84*f2105c61SSimon Glass 
85*f2105c61SSimon Glass __weak int __sata_stop(void)
86*f2105c61SSimon Glass {
87*f2105c61SSimon Glass 	int i, err = 0;
88*f2105c61SSimon Glass 
89*f2105c61SSimon Glass 	for (i = 0; i < CONFIG_SYS_SATA_MAX_DEVICE; i++)
90*f2105c61SSimon Glass 		err |= reset_sata(i);
91*f2105c61SSimon Glass 
92*f2105c61SSimon Glass 	if (err)
93*f2105c61SSimon Glass 		printf("Could not reset some SATA devices\n");
94*f2105c61SSimon Glass 
95*f2105c61SSimon Glass 	return err;
96*f2105c61SSimon Glass }
97*f2105c61SSimon Glass int sata_stop(void) __attribute__((weak, alias("__sata_stop")));
98*f2105c61SSimon Glass 
99*f2105c61SSimon Glass #ifdef CONFIG_BLK
100*f2105c61SSimon Glass static const struct blk_ops sata_blk_ops = {
101*f2105c61SSimon Glass 	.read	= sata_bread,
102*f2105c61SSimon Glass 	.write	= sata_bwrite,
103*f2105c61SSimon Glass };
104*f2105c61SSimon Glass 
105*f2105c61SSimon Glass U_BOOT_DRIVER(sata_blk) = {
106*f2105c61SSimon Glass 	.name		= "sata_blk",
107*f2105c61SSimon Glass 	.id		= UCLASS_BLK,
108*f2105c61SSimon Glass 	.ops		= &sata_blk_ops,
109*f2105c61SSimon Glass };
110*f2105c61SSimon Glass #else
111*f2105c61SSimon Glass U_BOOT_LEGACY_BLK(sata) = {
112*f2105c61SSimon Glass 	.if_typename	= "sata",
113*f2105c61SSimon Glass 	.if_type	= IF_TYPE_SATA,
114*f2105c61SSimon Glass 	.max_devs	= CONFIG_SYS_SATA_MAX_DEVICE,
115*f2105c61SSimon Glass 	.desc		= sata_dev_desc,
116*f2105c61SSimon Glass };
117*f2105c61SSimon Glass #endif
118