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